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:
Check out my BizTalk
R2 Training.