Images in this article missing? We recently lost them in a site migration. We're
working to restore these as you read this. Should you need an image in an emergency,
please contact us at info@codegain.com

Introduction

In this article, I will give you a step by step approach how you could build your own WCF service using REST.WCF is being popular day by day. Many of us is building services using WCF and want other application made on different architecture to communicate or inter operate with each other. REST or Representational State Transfer is a Design Pattern to build a service so that it works the same way as service works but it will eventually use Web Request - Response mechanism to communicate between clients rather than using SOAP messages.

What is REST ?

REST abbreviated as Representational State Transfer is coined by Roy Fielding is a Design pattern for Networked system. In this pattern the Client invokes a Web request using an URL, so the basic of REST pattern is to generate unique URI to represent data.

If you look into Roy Fielding's quote on REST it says :

"Representational State Transfer is intended to evoke an image of how a well-designed Web application behaves: a network of web pages (a virtual state-machine), where the user progresses through an application by selecting links (state transitions), resulting in the next page (representing the next state of the application) being transferred to the user and rendered for their use."

That means REST is intended for Web applications where the browser invokes each request by specifying unique Uri.

Why REST?

There are few basic thought behind the implementation of REST services. Lets look into it :

Web is very simple and successful.

Web Standards are fixed over time.

Web Services should follow the standards of Web.

REST uses Web Verbs to communicate to the services. The verbs like GET, POST, DELETE, PUT are major verbs for REST based applications. If you consider Hi - REST for your application, you should be strict of choosing these Verbs. According to the norms :

GET - Used to Retrieve Data.POST - To Append Data into the server.PUT - Used to Inserts and UpdatesDELETE - Used to delete data.

So each of these verbs produces a complete CRUD (Create, Retrieve, Update, Delete) for a Data centric service and which works the same way as Web works.

Steps to create REST based Service

Now let us take a quick pick on how you could build a REST based service. I will use standard CRUD operation for my application and also try to look into it through a Browser.REST services works the same way. First you need to create a Service with OperationContract and DataContract. The DataContract will have the Complex type if you want to use and the OperationContract will place all the operation on Data. So lets build one normal WCF application.

The code above is very straight forward, where the service exposes four Operations :

GetContact : Retrieves an individual contact from the list.SaveContact : Saves the contact into a list and returns statusRemoveContact : Removes an existing contact and returns status.GetAllContacts : Retrieves all contact as List.

So now if you use BasicHttpBinding for the service and create a servicehost for the application, you could easily consume the service and work on it. Notably I have used

[ServiceBehavior(InstanceContextMode= InstanceContextMode.Single)]

To ensure that the service will create only one instance of the class and hence every request will work on the same List.

Convert the application to REST

Now lets see how easily you can convert the application to use REST services. REST needs you to create UriTemplate for each Service Operations. To do this lets follow the steps :

Add System.ServiceModel.Web.dll. This dll allows you to produce REST based service. It exposes attributes like WebGet or WebInvoke which lets you to specify the UriTemplate for the current operation and also lets you specify the Method.

Apply WebGet attribute for Get requests and specify complete Uri for the service operation. You could use {0} to specify the parameters to the request. Please make sure the name of the parameter and the name of the variable in the service matches exactly and each of those parameters are of type String.

WebInvoke allows you to specify the Method thorough which the request to be made. Unlike WebGet, WebInvoke allows you to specify Method parameter which could be POST, PUT, DELETE or even GET.

So basically I have to specify the UriTemplate for each of the service contracts for the existing operations. The first operation GetContact will operate on WebGet which will be mapped into contact/{roll}. So if you call the service contact/1 it will map to the Service contract GetContact with roll 1.

WebInvoke on the other hand allows you to specify Method, as in RemoveContact and SaveContact i have used DELETE and POST methods.

Note : The notion of building UriTemplate is to specify some form of unique Uri. Always keep in mind, the external world will request the service using the URI.

Now lets go to our ServiceHost application and configure the service to use REST based approach. Basically for REST based service you need to use webHttpBinding as Binding configuration.

As you can see my service now uses WebHttpBinding rather than BasicHttpBinding and also created one EndpointBehaviour to have webHttp for the service configured for my endpoint. You dont need to change anything here.

Now if you run your service host, you will see the service to be running.

Test the application

1. REST services are been called from WebBrowsers, so lets open a web browser and see the list of all contacts.

Lets browse http://localhost:8086/ContactService/contacts, :

So it will produce an XML with all ArrayOfContact. Basically REST services communicates using XML. If you want to send a form using POST, you need to create an XML with the same schema as specified in the DataMember, the REST service will parse your xml and produce the object.

This tutorial will explain how to create and consume a basic REST Enabled service in WCF. This is very basic tutorial but it will be very helpful in debugging common error while creating REST Services.