web-dev-qa-db-fra.com

Comment supprimer l'extension ".svc" dans le service WCF RESTful?

À 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?

51
Morgan Cheng

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).

30
Darin Dimitrov

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

47
Thiago Silva

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

4
Rick Strahl

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

3
Jason Kresowaty

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]
2
Cheeso

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 .. .

2
Eran Kampf

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

1
Kenneth