I’ve been playing with the REST support
in .NET 3.5.  I’m really enjoying the programming model, but I am not enjoying
the .svc file extension in my URLs (I’m not the only
person
I know who has felt this way for quite some time).

IMO (from what little I know about the REST style) URLs shouldn’t have things like
extensions in them (or preferably not).  So with they way WCF endpoint hosting
in IIS works (obviously if I am hosting a webHttpBinding in a non-IIS host I can totally
control the URLs, but I am writing a REST API to something where I plan to be hosting
inside of IIS).  This would end up being my url:

http://host/albumn.svc/instance/

and I want:

http://host/albumn/instance/

The .svc extension in the URL doesn’t seem opaque to me.  I tried modifying the
HttpHandler element for the svc file – but that didn’t work for various reasons. 
So I ended up writing a simple HttpModule to do URL re-writing (using HttpContext.RewritePath). 
I didn’t really want any config relating to URLs – so this module assumes you
are serving up only REST based URLs from a web application.  If you were going
to use it and serve up other handlers (like aspx files etc) it would need to
be modified. Here is the module code:

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);
}
};

}

}

After configuring this in my web.config – I have the ability to type:

http://localhost/RestTest/Service2/Test?id=9999

and the module will translate it to Service2.svc as the handler file – which makes
WCF happy.

If you are interested you can download the code here:

RestTest.zip
(3.71 KB)


Check out my BizTalk
R2 Training.