Sunday, August 19, 2007 3:39:26 AM (GMT Daylight Time, UTC+01:00)
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)
EDIT: Christian pointed out that this approach alone will not work in IIS6 (my approach is for integrated mode of IIS7). For IIS you have to add aspnet_isapi.dll to the Wildard Application Maps. But then he goes on to tell me no one will do that
. So I say - good reason to move to IIS7 and Longhorn/Windows 2008 - since it has a go-live license.
ASP.NET | WCF