CRUD in RESTful Services of WCF-Tutorial

No.of Views4579
Bookmarked0 times
Downloads 
Votes0
By  abhi2434   On  19 Nov 2010 09:11:25
Tag : WCF , REST Services
In this article, I will give you a step by step approach how you could build your own WCF service using REST.
emailbookmarkadd commentsprint

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.

 

Image Loading

Why REST?

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

  1. Web is very simple and successful.
  2. Web Standards are fixed over time.
  3. 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 Updates
DELETE - 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.

[ServiceContract]
public interface ICRUDContact
{ 
    [OperationContract]
    Contact GetContact(string roll);

    [OperationContract]bool SaveContact(Contact currentContact);

    [OperationContract]bool RemoveContact(string roll);

    [OperationContract]
    List<Contact> GetAllContacts();
}
[DataContract]
public class Contact
{
    [DataMember]public int Roll { get; set; }

    [DataMember]public string Name { get; set; }

    [DataMember]public string Address { get; set; }

    [DataMember]public int Age { get; set; }
}
[ServiceBehavior(InstanceContextMode= InstanceContextMode.Single)]
public class CRUDContact : ICRUDContact
{private List<Contact> _store;internal List<Contact> Store
    {get{this._store = this._store ?? new List<Contact>();return this._store;
        }
    }#region ICRUDContact Memberspublic Contact GetContact(string roll)
    {return this.Store.FirstOrDefault(item => item.Roll.ToString().Equals(roll));
    }public bool SaveContact(Contact currentContact)
    {if (this.Store.Any(item => item.Roll == currentContact.Roll))return false;this.Store.Add(currentContact);return true;
    }public bool RemoveContact(string roll)
    {
        var currentContacts = this.Store.Where(item => item.Roll.ToString().Equals(roll));if (currentContacts.Count() <= 0)return false;foreach (Contact currentContact in currentContacts)this.Store.Remove(currentContact);return true;
    }public List<Contact> GetAllContacts()
    {return this.Store;
    }#endregion}

 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 status
RemoveContact : 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 :

  1. 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.
  2. 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.
  3. 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 after changing the contract my service would look like :

[ServiceContract]
public interface ICRUDContact
{
    [WebGet(UriTemplate="contact/{roll}")]
    [OperationContract]
    Contact GetContact(string roll);

    [WebInvoke(Method="POST", UriTemplate="contacts")]
    [OperationContract]bool SaveContact(Contact currentContact);

    [WebInvoke(Method = "DELETE", UriTemplate = "contact/{roll}")]
    [OperationContract]bool RemoveContact(string roll);

    [WebGet(UriTemplate = "contacts")]
    [OperationContract]
    List<Contact> GetAllContacts();
}

 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.
 

<system.serviceModel>
    <services>
      <service name="ContactService.CRUDContact" behaviorConfiguration="httpBehaviour">
        <endpoint address="" binding="webHttpBinding" contract="ContactService.ICRUDContact" behaviorConfiguration="httpEndpointBehavour">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8086/ContactService/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="httpBehaviour">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="httpEndpointBehavour">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

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, :

Image Loading

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.

Download Sample Project

Download source files -206 kb

Conclusion

In this article, I gave you a step by step approach how you could build your own WCF service using REST.I hope the article will help you.

 
Sign Up to vote for this article
 
About Author
 
abhi2434
Occupation-Not Provided
Company-Not Provided
Member Type-Senior
Location-Not Provided
Joined date-22 Oct 2009
Home Page-Not Provided
Blog Page-Not Provided
 
 
Other popularSectionarticles
Comments
There is no comments for this articles.
Leave a Reply
Title:
Display Name:
Email:
(not display in page for the security purphase)
Website:
Message:
Please refresh your screen using Ctrl+F5
If you can't read this number refresh your screen
Please input the anti-spam code that you can read in the image.
^ Scroll to Top
</