ObjectiveThis article will explain step to step explanation of, how to create a REST based service and how to consume that in a client. Although, this is a very simple service taken as an example, but it will really help in creating complex REST Services. Step 1Create a new project as WCF Service application type. Step 2Rename IService.cs to IRestService.cs and Service1.cs to RestService.cs. And delete all the existing code from there. Step 3Open Web.Config file and delete below highlighted code. In other words delete all default bindings and endpoints for existing service model. Delete existing <system.serviceModel> <system.serviceModel><services><service behaviorConfiguration="RestServicePublishing.Service1Behavior"name="RestServicePublishing.RestService"><endpoint address="" binding="wsHttpBinding" contract="RestServicePublishing.IRestService"><identity><dns value="localhost" /></identity></endpoint><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /></service></services><behaviors><serviceBehaviors><behavior name="RestServicePublishing.Service1Behavior"><!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --><serviceMetadata httpGetEnabled="true"/><!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before
deployment to avoid disclosing exception information --><serviceDebug includeExceptionDetailInFaults="false"/></behavior></serviceBehaviors></behaviors></system.serviceModel> Step 4Right click on RestService.cs and open View markup. In Markup of RestService.cs , add below code there Factory="System.ServiceModel.Activation.WebServiceHostFactory" So after adding code the markup would look like Markup of RestService.cs
<%@ ServiceHost Language="C#" Debug="true"
Service="RestServicePublishing.RestService"
CodeBehind="RestService.svc.cs"
Factory="System.ServiceModel.Activation.WebServiceHostFactory"%> Step 5: Writing Service.Add following references to the service project. Microsoft.Http.dll Microsoft.Http.Extension.dll System.ServiceModel.Web.dll Note : These dll can be download from Microsoft site else it could be downloaded from the attached Zip file. Step 6Add a new project as of type class library and give it name UtilityClasses. Rename Class1.cs to Number.cs . Type the below code in Number.Cs using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Utilityclasses
{
[Serializable]public class NumberService
{public int Number1 { get; set; }public int Number2 { get; set; }
}
}
Step 7Add Namespaces to IRestService.cs using System.ServiceModel.Web; Step 8Type the below code. IRestService.cs using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.ServiceModel.Web;
using Utilityclasses;
namespace RestServicePublishing
{// NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.[ServiceContract]public interface IRestService
{
[OperationContract(Name="AddParameter")]
[WebInvoke(UriTemplate = "/",Method="POST")]int Add(NumberService n1);
[OperationContract(Name="Add")]
[WebGet(UriTemplate = "/")]int Add()
}
}
Explanation of Code This code is used to construct URI for REST service. [WebInvoke(UriTemplate = "/",Method="POST")] Method parameter says what type of HTTP request; this URI is going to entertain. In this case it is Http POST. UriTemplate parameter says, what would be URI for this particular method. In this case it is one back slash means; it is root URI of this service. So, to invoke this method add (), the URI address would be http://localhost:3602/RestService.svc/
Where 3602 is port number of web server, where this service is running. Let, if the above code is modified as
[WebInvoke(UriTemplate = "/ADD/RRaveen",Method="POST")] Then it would be invoked as http://localhost:3602/RestService.svc/ADD/RRaveen Step 9: Implementing the Service RestService.cs using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using Utilityclasses;
namespace RestServicePublishing
{// NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.public class RestService : IRestService
{public int res = 100;public int Add(NumberService n1)
{
res = Convert.ToInt32(n1.Number1) + Convert.ToInt32(n1.Number2);return res;
}public int Add()
{return res;
}
}
}Step 10: Testing the Service in browser.
1. Build the Service 2. Right click on RestService.cs and select view in browser. Explanation of output:
Output 100 is returned in the browser by the service. It is because, below service method. URI of below GET method is mapped to root of the URI. And this method is returning 100. (See RestService.cs) [OperationContract(Name="Add")]
[WebGet(UriTemplate = "/")]int Add()on modifying URI in address bar of browser as below ,
http://localhost:3602/RestService.svc/abc
output would be , because given URI is not mapped to any method in the service. Step 11: Consuming at client side.Add new console project in solution and give it name as ConsoleTestProject. Add reference of project UtilityClasses Add following references to the console project. Microsoft.Http.dll Microsoft.Http.Extension.dll System.ServiceModel.Web.dll
Step 12:Paste or type below code in Program.cs using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using Microsoft.Http;
using Microsoft.ServiceModel.Web;
using Microsoft.ServiceModel.Web.SpecializedServices;
using System.Runtime.Serialization;
using Utilityclasses;
namespace ConsoleTestProject
{class Program
{static string uri;static void Main(string[] args)
{
uri = "http://localhost:3602/RestService.svc/";// Calling without parameterConsole.WriteLine(AddWithoutParameter());
Console.Read();//Calling with parameterNumberService obj = new NumberService() { Number1 = 7, Number2 = 2 };
Console.WriteLine(AddWithParameter(obj));
Console.Read();
}public static string AddWithoutParameter()
{using (HttpResponseMessage response = new HttpClient().Get(uri))int res = response.Content.ReadAsDataContract<int>();return res.ToString();
}
}public static string AddWithParameter(NumberService obj)
{using (HttpResponseMessage response = new HttpClient().Post(uri,HttpContentExtensions.CreateDataContract(obj)))
{int res = response.Content.ReadAsDataContract<int>();return res.ToString();
}
}
}
}
Explanation:
There are two static methods AddWithoutParameter() -> To Invoke HTTP Get on Service URI. {In Green} AddWithParameter() -> To Invoke HTTP POST on Service URI. {In Yellow}
AddWithoutParameter()
This is just creating instance of HttpResponse and calling HttpClient Get method to fetch value from the service. AddWithParameter()
This is just creating instance of HttpResponse and calling HttpClient POST method to fetch value from the service.
Output
Thank you Happy Coding. Sample Project SourceDownload source files -241 kb |