À ma connaissance, le WCF RESTful a toujours ".svc" dans son URL.
Par exemple, si l'interface de service est comme
[OperationContract]
[WebGet(UriTemplate = "/Value/{value}")]
string GetDataStr(string value);
L'URI d'accès est comme " http: //machinename/Service.svc/Value/2 ". À ma connaissance, une partie de l'avantage REST est qu'il peut masquer les détails de l'implémentation. Un URI RESTful comme " http: // machinename/Service/value/2 " peut être implémenté par n'importe quel framework RESTful, mais un " http: //machinename/Service.svc/value/2 " indique que son implémentation est WCF.
Comment puis-je supprimer cet hôte ".svc" dans l'URI d'accès?
Dans IIS 7, vous pouvez utiliser le rl Rewrite Module comme expliqué dans ce blog post .
Dans IIS 6 vous pouvez écrire un module http qui réécrira l'url:
public class RestModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication app)
{
app.BeginRequest += delegate
{
HttpContext ctx = HttpContext.Current;
string path = ctx.Request.AppRelativeCurrentExecutionFilePath;
int i = path.IndexOf('/', 2);
if (i > 0)
{
string svc = path.Substring(0, i) + ".svc";
string rest = path.Substring(i, path.Length - i);
ctx.RewritePath(svc, rest, ctx.Request.QueryString.ToString(), false);
}
};
}
}
Et il y a une belle exemple comment obtenir des URL sans extension dans IIS 6 sans utiliser de modules ISAPI tiers ou de mappage générique).
Je sais que ce message est un peu vieux maintenant, mais si vous utilisez .NET 4, vous devriez envisager d'utiliser le routage d'URL (introduit dans MVC, mais introduit dans le noyau ASP.NET).
Dans le démarrage de votre application (global.asax), il vous suffit de disposer de la ligne de configuration d'itinéraire suivante pour configurer l'itinéraire par défaut:
RouteTable.Routes.Add(new ServiceRoute("mysvc", new WebServiceHostFactory(), typeof(MyServiceClass)));
alors vos URL ressembleraient à ceci:
http://servername/mysvc/value/2
HTH
Voici des informations plus détaillées en utilisant le module de réécriture IIS 7, ou en utilisant un module personnalisé: http://www.west-wind.com/Weblog/posts/570695.aspx
Il existe également un moyen d'éliminer complètement les fichiers physiques .svc. Cela peut être fait avec un VirtualPathProvider
.
Voir: http://social.msdn.Microsoft.com/Forums/en-US/wcf/thread/350f2cb6-febd-4978-ae65-f79735d412db
Dans IIS6 ou 7, vous pouvez utiliser IIRF , un filtre de réécriture gratuit. Voici la règle que j'ai utilisée:
# Iirf.ini
#
RewriteEngine ON
RewriteLog c:\inetpub\iirfLogs\iirf-v2.0.services
RewriteLogLevel 3
StatusInquiry ON RemoteOk
CondSubstringBackrefFlag *
MaxMatchCount 10
# remove the .svc tag from external URLs
RewriteRule ^/services/([^/]+)(?<!\.svc)/(.*)$ /services/$1.svc/$2 [L]
C'est facile IIS 7 - utilisez un module de réécriture d'URL
On IIS 6 J'ai trouvé qu'il était plus facile d'utiliser le module de réécriture ISAPI qui vous permet de définir un ensemble d'expressions régulières qui mappent les URL de demande au fichier .svc .. .
Ajoutez ceci à votre global.asax
private void Application_BeginRequest(object sender, EventArgs e)
{
Context.RewritePath(System.Text.RegularExpressions.Regex.Replace(
Request.Path, "/rest/(.*)/", "/$1.svc/"));
}
Cela remplacera/rest/Service1/arg1/arg2 par /Service1.svc/arg1/arg2