A Beginner’s Tutorial on Creating WCF REST Services

In this article we will try to understand what are WCF REST services. We will see what is required from a service developers perspective to create a REST enabled WCF service. We see how we can use and consume restful WCF services.

Disclaimer: This is a rather old article(5 years almost). And I want to make a disclaimer here – This is not a REST service. This article talks about REST but ultimately end up creating the HTTP based service using WCF. This WCF service created is not following the REST architectural guidelines. Apologies for that(I guess we all get wiser with time). I will update the article but till then i feel like this disclaimer should be present. 

Background

Overview of REST

RESTstands for Representational State Transfer. This is a protocol for exchanging data over a distributed environment. The main idea behind REST is that we should treat our distributed services as a resource and we should be able to use simple HTTP protocols to perform various operations on that resource.

When we talk about the Database as a resource we usually talk in terms of CRUDoperations. i.e. Create, Retrieve, Update and Delete. Now the philosophy of REST is that for a remote resource all these operations should be possible and they should be possible using simple HTTP protocols.

Now the basic CRUD operations are mapped to the HTTP protocols in the following manner:

  • GET: This maps to the R(Retrieve) part of the CRUD operation. This will be used to retrieve the required data (representation of data) from the remote resource.
  • POST: This maps to the U(Update) part of the CRUD operation. This protocol will update the current representation of the data on the remote server.
  • PUT: This maps to the C(Create) part of the CRUD operation. This will create a new entry for the current data that is being sent to the server.
  • DELETE: This maps to the D(Delete) part of the CRUD operation. This will delete the specified data from the remote server.

so if we take an hypothetical example of a remote resource that contain a database of list of books. The list of books can be retrieved using a URL like:

www.testwebsite.com/books

To retrieve any specific book, lets say we have some ID that we can used to retrieve the book, the possible URL might look like:

www.testwebsite.com/books/1

Since these are GETrequests, data can only be retrieved from the server. To perform other operations, if we use the similar URI structure with PUT, POSTor DELETEoperation, we should be able to create, update and delete the resource form the server. We will see how this can be done in implementation part.

Note: A lot more complicated queries can be performed using these URL structures. we will not be discussing the complete set of query operations that can be performed using various URL patterns.

Using the code

Now we can create a simple WCF service that will implement all the basic CRUD operations on some database. But to make this WCF service REST compatible we need to make some changes in the configuration, service behaviors and contracts. Let us see what WCF service we will be creating and then we will see how we can make useful over the REST protocol.

creating REST enabled ServiceContract

We will create Books table and will try to perform CRUD operations on this table.

table

To perform the Database operations within the service lets use Entity framework. This can very well be done by using ADO.NET calls or some other ORM but I chose entity framework. (please refer this to know about entity framework:  An Introduction to Entity Framework for Absolute Beginners[^]). The generated Entity will look like following.

entity

Now the service contract will contain functions for CRUD operations. Let us create the ServiceContractfor this service:

Right now this is a very simple service contract, to indicate that individual operations can be called using REST protocol, we need to decorate the operations with additional attributes. The operations that are to be called on HTTP GETprotocol, we need to decorate them with the WebGetattribute. The operations that will be called by protocols, like POST, PUT, DELETEwill be decorated with WebInvokeattribute.

Understanding UriTemplate

Now before adding these attributes to these operations let us first understand the concept of UriTemplate. UriTemplateis a property of WebGet and WebInvokeattribute which will help us to map the parameter names coming from the HTTP protocol with the parameter names of ServiceContract. For example, if someone uses the following URI:

localhost/testservice/GetBookById/2

We need to map this first parameter with the id variable of the function. this can be done using the UriTemplate. Also, we can change the function name specifically for the URI and the name of URI function name will be mapped to the actual function name i.e. if we need to call the same URL as:

localhost/testservice/Book/2

then we can do that by specifying the UriTemplatefor the operation as:

Following the same lines, let us define the UriTemplatefor other methods too.

Implementing the Service

Now the service implementation part will use the entity framework generated context and entities to perform all the respective operations.

Restful WCF service Configuration

Now from the ServiceContractperspective the service is ready to serve the REST request but to access this service over rest we need to do some changes in the service behavior and binding too.

To make the service available over REST protocol the binding that needs to be used is the webHttpBinding. Also, we need to set the endpoint’s behavior configuration and define the webHttpparameter in the endpointBehavior. So our resulting configuration will look something like:

config

Test the service

Now to test the service we will simply run the service and use the URLs to retrieve the data. let see this for our GEToperations in action.

GetAll

And now testing the query to get a single record

GetOne

And so we have seen that we received the response in the browser itself in form of XML. We can use this service without even consuming it by adding a service reference by using the URLs and HTTP protocols.

Note: Here I am not demonstrating the other operations for POST, PUT and DELETE but they are fairly straight forwards and a simple HTML page sending the data using the required protocol with the specified parameter names will perform the operation.

Using JSON

We can also change the Response and Request format to use JSONinstead of XML. To do this we need to specify properties of the WebInvokeattribute.

  • RequestFormat: By default its value is WebMessageFormat.XML. to change it to JSON format, it needs to be set to WebMessageFormat.Json.
  • ResponseFormat: By default its value is WebMessageFormat.XML. to change it to JSON format, it needs to be set to WebMessageFormat.Json.

Let us create one more operation in our service contract called as GetBooksNamesand will apply the ResponseFormatas Json for this method.

The response will now appear in the JSON format.

JSON

And now we have a WCF REST service ready with us.

Note: We also have a ready made template in Visual studio to create WCF data services that provides us with easy way to create REST enabled ODATA services. We will perhaps talk about them separately.

Point of interest

In this article we have seen how we can create REST enabled WCF services. We have also looked at a sample application for implementing the same. A lot has been left for the reader as an exercise(like operations using POST, PUT and DELETE) but still I hope this has been somewhat informative.

Download sample code for this article: WcfRestSample

One thought on “A Beginner’s Tutorial on Creating WCF REST Services

  1. […] ODATA is a protocol using which we can share and access the data using AtomPubprotocol. This AtomPubprotocol is mainly used in creating feeds from websites. It is built on of the REST architecture philosophy where the CRUD operations in the remote data resource can be pefromed using HTTP protocols like GET, PUT, POST and DELETE. (For more details on this refer: A Beginner’s Tutorial on Creating WCF REST Services[^]). […]