How to remove the ".svc" extension in RESTful WCF service?

WcfRest

Wcf Problem Overview


In my knowledge, the RESTful WCF still has ".svc" in its URL.

For example, if the service interface is like

[OperationContract]
[WebGet(UriTemplate = "/Value/{value}")]
string GetDataStr(string value);

The access URI is like "http://machinename/Service.svc/Value/2";. In my understanding, part of REST advantage is that it can hide the implementation details. A RESTful URI like "http://machinename/Service/value/2" can be implemented by any RESTful framework, but a "http://machinename/Service.svc/value/2" exposes its implementation is WCF.

How can I remove this ".svc" host in the access URI?

Wcf Solutions


Solution 1 - Wcf

I know this post is a bit old now, but if you happen to be using .NET 4, you should look at using URL Routing (introduced in MVC, but brought into core ASP.NET).

In your app start (global.asax), just have the following route configuration line to setup the default route:

RouteTable.Routes.Add(new ServiceRoute("mysvc", new WebServiceHostFactory(), typeof(MyServiceClass)));

then your URLs would look like this:

http://servername/mysvc/value/2

HTH

Solution 2 - Wcf

In IIS 7 you can use the Url Rewrite Module as explained in this blog post.

In IIS 6 you could write an http module that will rewrite the 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);
            }
        };
    }
}

And there's a nice example how to achieve extensionless urls in IIS 6 without using third party ISAPI modules or wildcard mapping.

Solution 3 - Wcf

Here's more detailed info using the IIS 7 Rewrite Module, or using a custom module: http://www.west-wind.com/Weblog/posts/570695.aspx

Solution 4 - Wcf

There is also a way to eliminate the physical .svc files altogether. This can be done with a VirtualPathProvider.

See: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/350f2cb6-febd-4978-ae65-f79735d412db

Solution 5 - Wcf

Its easy on IIS 7 - use a URL Rewrite Module

On IIS 6 I found its easiest to use the ISAPI Rewrite module which lets you define a set of regular expressions that map the request Urls to the .svc file...

Solution 6 - Wcf

In IIS6 or 7, you can use IIRF, a free rewriting filter. Here's the rule I used:

# 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]

Solution 7 - Wcf

Add this to your global.asax

private void Application_BeginRequest(object sender, EventArgs e)
{
	Context.RewritePath(System.Text.RegularExpressions.Regex.Replace(
               Request.Path, "/rest/(.*)/", "/$1.svc/"));
}

This will replace /rest/Service1/arg1/arg2 by /Service1.svc/arg1/arg2

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMorgan ChengView Question on Stackoverflow
Solution 1 - WcfThiago SilvaView Answer on Stackoverflow
Solution 2 - WcfDarin DimitrovView Answer on Stackoverflow
Solution 3 - WcfRick StrahlView Answer on Stackoverflow
Solution 4 - WcfJason KresowatyView Answer on Stackoverflow
Solution 5 - WcfEran KampfView Answer on Stackoverflow
Solution 6 - WcfCheesoView Answer on Stackoverflow
Solution 7 - WcfKennethView Answer on Stackoverflow