Objective
In this article, I will show you
- How to create a REST based service?
- How to host a REST based service in Console application?
- How to consume a REST Service at client?
Follow the steps as below,
Step1
Create a New project. Select Console application as project type.
![WCF1.gif]()
Step 2
Add a new project to same solution. Choose the project type as class library.
![WCF2.gif]()
Step 3
Add below references in both projects console and service library
System.ServiceModel;
System.ServiceModel.Description;
System.ServiceModel.Web;
![WCF3.gif]()
If you are not able to get System.ServiceModel.Webdll by default , when you are
adding as Add Reference in your console application project and class library
project , then follow the below steps - Right click on your console application project or class library project
- Select properties from context menu
- From Application tab, if you see by default .NET Framework 4 Client profile
is selected. Change that to .NET Framework 4.0. So your target framework should
be .NET Framework 4.0.
![WCF4.gif]()
Now you should able to see all the dll when you add service reference in
project.
Step 4
In this step, I will create contract of service - Open the Contract (Class Library project).
- Delete Class1.
- Right click and add a new item then select Interface from Code tab.
![WCF5.gif]()
- Make Interface as public and put ServiceContractattribute.
- Declare two operation contracts. Make one attributed with WebGet and another
attributed with Web Invoke.
IService.cs
using
System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.ServiceModel;
usingSystem.ServiceModel.Web;
namespace
Contracts
{
[ServiceContract]
publicinterfaceIService
{
[OperationContract]
[WebGet]
stringGetMessage(stringinputMessage);
[OperationContract]
[WebInvoke]
stringPostMessage(stringinputMessage);
}
}
Step 5
In this step, I will implement the contract in Service file. To do so,
- Right click and add a class in Console application.
![WCF6.gif]()
- Give any name; I am giving name here Service of the class.
- Implement the interface (Contract IService) in this class.
Service.cs
using
System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
using
Contracts;
namespaceSelfHostedRESTService
{
publicclassService
:IService
{
publicstringGetMessage(stringinputMessage)
{
return"Calling
Get for you " + inputMessage;
}
publicstringPostMessage(stringinputMessage)
{
return"Calling
Post for you " + inputMessage;
}
}
}
Step 6
In this step, I will host the service in a console application. So to do so
- Open Program.cs
- Create instanced of WebServieceHostFactory
![WCF7.gif]()
- Add a service end point
![WCF8.gif]()
- Add service debug behavior
![WCF9.gif]()
As we know, REST service used webHttpBindding. And we need to make sure that
HttpHelpPageEanbled is false.
Program.cs
using
System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.ServiceModel;
usingSystem.ServiceModel.Description;
usingSystem.ServiceModel.Web;
using
Contracts;
namespaceSelfHostedRESTService
{
classProgram
{
staticvoid
Main(string[] args)
{
WebServiceHost
host = newWebServiceHost(typeof(Service),
newUri("http://localhost:8000"));
ServiceEndpointep
= host.AddServiceEndpoint(typeof(IService),newWebHttpBinding(),
"");
ServiceDebugBehaviorstp=host.Description.Behaviors.Find<ServiceDebugBehavior>();
stp.HttpHelpPageEnabled = false;
host.Open();
Console.WriteLine("Service
is up and running");
Console.WriteLine("Press
enter to quit ");
Console.ReadLine();
host.Close();
}
}
}
Step 7
Just press F5 to run the service.
![WCF10.gif]()
Now once service is up and running, I can test,
[OperationContract]
[WebGet]
stringGetMessage(stringinputMessage);
In browser.Because it is attributed with WebGet. To test this, I need to browse
to URL,
http://localhost:8000/GetMessage?inputMessage=dj
If you see WebServiceHost , I am hosting my REST service in
http://localhost:8000/ and then I need to append the method name and then
parameter I need to pass.
![WCF11.gif]()
Step 8
In this step, I will create a Console client which will consume the REST client.
So to do so , follow the below steps
- Create a console project.
- Add reference of System.ServiceModel and System.ServiceModel.Web (See Step
3).
- Add reference of Contract class library (we created in Step 2)
- Write below code in Program.cs
Program.cs
using
System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.ServiceModel;
usingSystem.ServiceModel.Web;
usingSystem.ServiceModel.Description;
using
Contracts;
namespaceClientForRESTSelfHosted
{
classProgram
{
staticvoid
Main(string[] args)
{
ChannelFactory<IService>cf
= newChannelFactory<IService>(newWebHttpBinding(),
"http://localhost:8000");
cf.Endpoint.Behaviors.Add(newWebHttpBehavior());
IService
channel = cf.CreateChannel();
Console.WriteLine(channel.GetMessage("Dhananjay
Get"));
Console.WriteLine(channel.PostMessage("Dhananjay
Post"));
Console.Read();
}
}
}
Explanation
- I am creating an instance of Channel Factory.
- I am passing IService (from dll of Contract class library) as type to channel
factory.
- I am passing as parameter type of binding that is WebHttpBinding and address.
- Address is exactly as same as of the address was in host instance.
- I am creating a channel of type IService1.
- Calling the methods on the channel.
Press F5 to run the application,
![WCF12.gif]()
I hope this post was useful. Thanks for reading. Happy coding .