Kevin Isom

Just a good ol' boy, by-God Virginia-proud and country-sophisticated -- sort of like a John Deere tractor with air conditioning and satellite radio.

REST as Simple as Possible

I've been doing a lot of REST based services lately and for something that is as simple a concept as REST it is actually not the easiest thing to find guidance for a .Net developer. It's simple, or at least it should be. My first stop was the WCF Rest Starter Kit. I thought great, surely this would get me going with no fuss. I only wish it were so. I thought I could create a project with it and just get going. Instead what I got was a whole heap of code that didn't really start me on the way at all. I won't totally bag on the starter kit. I rather like the items around the atom publishing protocol. I briefly considered just writing an http handler for that but I knew that there had to be a better way.

Enter WCF.

It is actually incredibly easy to write REST services in .net. with WCF. 

Step 1

Create a new WCF service  in your website.

Step 2

Go to the cruft VS adds to your Web.config when creating your service and remove it and replace it with the following

   1:  <system.serviceModel>
   2:      <behaviors>
   3:          <endpointBehaviors>
   4:              <behavior name="web">
   5:                  <webHttp/>
   6:              </behavior>
   7:          </endpointBehaviors>
   8:      </behaviors>
   9:      <services>
  10:          <service name="Service">
  11:              <endpoint address=""
  12:                    binding="webHttpBinding"
  13:                    contract="IService"
  14:                    behaviorConfiguration="web"/>
  15:      </service>
  16:      <service name="WebsiteService">
  17:          <endpoint address=""
  18:                   binding="webHttpBinding"
  19:                   contract="WebsiteService"
  20:                   behaviorConfiguration="web"/>
  21:          </service>
  22:      </services>
  23:  </system.serviceModel>


And all you have to do it is add some attributes to your service contract

   1:  using System.ServiceModel;
   2:  using System.ServiceModel.Web;
   3:   
   4:  [ServiceContract]
   5:  public interface IService
   6:  {
   7:      [OperationContract]
   8:      [WebGet(UriTemplate = "/SayHello", ResponseFormat = WebMessageFormat.Xml)]
   9:      string SayHello();
  10:   
  11:      [OperationContract]
  12:      [WebGet(UriTemplate = "/SayHello/{user}", ResponseFormat = WebMessageFormat.Xml)]
  13:      string SayHelloToUser(string user);
  14:   
  15:      [OperationContract]
  16:      [WebGet(UriTemplate = "/SayHelloInJson/{user}", ResponseFormat = WebMessageFormat.Json)]
  17:      string SayHelloToUserInJson(string user);
  18:   
  19:      [OperationContract]
  20:      [WebGet(UriTemplate = "/GetPackage", ResponseFormat = WebMessageFormat.Json)]
  21:      Package GetPackage();
  22:   
  23:   
  24:      [OperationContract]
  25:      [WebInvoke(Method = "POST", UriTemplate = "/PlainPost", ResponseFormat = WebMessageFormat.Xml,
  26:          BodyStyle = WebMessageBodyStyle.Wrapped)]
  27:      int PlainPost(string username, string name, string message);
  28:   
  29:  }

Then implement the interface and you are good to go. I'll cover consuming these with both .Net and Javascript in a later post.

The attributes are where the real magic happens

The WebGet attribute tells WCF that this method is invoked via an HTTP Get Request.

The UriTemplate attribute property sets the URI of the call so on SayHello the url requested would be ~/Service.svc/SayHello

The ResponseFormat attribute property tells the service to return either XML or Json depending on the value of the WebMessageFormat enum

The WebInvoke attribute gives you to specify the type of HTTP request you make. The default method is POST.

The BodyStyle attribute property sets the body style of the messages sent to and from the service.

There you have it. Simple REST from WCF.

Cheers

Published Saturday, February 21, 2009 8:07 PM by kevinisom
Filed under: , ,

Comments

# Bruno Campagnolo de Paula weblog &raquo; Resumo do dia para 2009-02-21@ Saturday, February 21, 2009 10:23 PM

Pingback from  Bruno Campagnolo de Paula weblog &raquo; Resumo do dia para 2009-02-21

# REST as Simple as Possible - Kevin Isom@ Sunday, February 22, 2009 4:01 PM

Thank you for submitting this cool story - Trackback from DotNetShoutout

# Bruno Campagnolo de Paula weblog &raquo; Resumo do dia para 2009-02-22@ Sunday, February 22, 2009 11:12 PM

Pingback from  Bruno Campagnolo de Paula weblog &raquo; Resumo do dia para 2009-02-22

# Bruno Campagnolo de Paula weblog &raquo; Resumo do dia para 2009-03-22@ Sunday, March 22, 2009 11:14 PM

Pingback from  Bruno Campagnolo de Paula weblog &raquo; Resumo do dia para 2009-03-22

Leave a Comment

(required) 
(required) 
(optional)
(required)