chris soe
chris soe

Reputation: 21

WCF REST with a clean URL

I'm considering to host WCF Rest Service that i've built on IIS 7. The URL to access my service will be something like

api.mycompany.com/applicationName/Service.svc/users/1347

Recently, i've been looking to some REST API implementation with a clean URL like Yahoo API

social.yahooapis.com/v1/user/{guid}/contacts

I'm wondering what will be the best WCF host environment (e.g. Windows Service) or any solution (e.g. URL rewrite module) considering that I dont want to have application name and .svc in my URL so that I can have a completely clean URL for my REST API

Upvotes: 0

Views: 860

Answers (3)

Michael D. Irizarry
Michael D. Irizarry

Reputation: 6302

You can use UriTemplate Class also look into the WCF Rest Starter Kit.

Here is a good explanation.

Upvotes: 0

Rajesh
Rajesh

Reputation: 7886

You can use the new WebApi template in .NET 4 that provides you to specify the route in the global.asax. This gets rid of the svc file completely. You need to have AspNetCompatilbityMode = true. See the sample below:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class RestService
{
    // TODO: Implement the collection resource that will contain the SampleItem instances

    private static List<SampleItem> sampleCollection = new List<SampleItem>();

    [WebGet]
    public List<SampleItem> GetCollection()
    {
        // TODO: Replace the current implementation to return a collection of SampleItem instances
        if (sampleCollection.Count == 0)
        {
            sampleCollection = new List<SampleItem>();
            sampleCollection.Add(new SampleItem() { Id = 1, StringValue = "Hello 1" });
            sampleCollection.Add(new SampleItem() { Id = 2, StringValue = "Hello 2" });
            sampleCollection.Add(new SampleItem() { Id = 3, StringValue = "Hello 3" });
            sampleCollection.Add(new SampleItem() { Id = 4, StringValue = "Hello 4" });
            sampleCollection.Add(new SampleItem() { Id = 5, StringValue = "Hello 5" });
        }
        return sampleCollection;
    }
}

You web.config will have teh following:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>
<system.serviceModel>
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
            via the attributes on the <standardEndpoint> element below
        -->        
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

And finally your Global.asax as follows:

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
    }

    private void RegisterRoutes()
    {
        // Edit the base address of Service1 by replacing the "Service1" string below
        RouteTable.Routes.Add(new ServiceRoute("RestService", new WebServiceHostFactory(), typeof(RestService)));
    }
}

Now the URL for your service would be :

http://localhost/SampleApp/RestService/GetCollection

Now you have clean and proper REST URLs

Upvotes: 1

Kent Boogaart
Kent Boogaart

Reputation: 178810

You can use the URL rewrite module in IIS 7 to achieve this.

Upvotes: 0

Related Questions