Jon Flanders' Blog

Using WCF WebHttpBinding and WebGet with nicer Urls

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.

 |    #    Comments [5]   

Navigation

Courses

Search

Subscribe

  • RSS 2.0
  • Add to Windows Live button
  • Add to Google button
  • Add to MyMSN button
  • Add to MyYahoo button
  • Add to Bloglines button
  • Add to Newsgator button