Introduction
In this article, we will see how to create WCF REST based service. In this example, we will define two methods, GetSampleMethod
(method type is GET
) & PostSampleMethod
(method type is POST
).
GET
method will take input as String
& returns formatted String
. POST
method will take input as XML (user registration) & return status string
.
Note: One should have basic knowledge of what is WCF, why WCF & my article will discuss HOW to use WCF with webHttpBinding
.
We will divide this article into the below sections:
- Define WCF Service
- Define Interface
- Define Class
- Implement
POST
& GET
methods
- Define Configuration for WCF Service
- Service Configuration
- Behavior Configuration
- Smoke test WCF service (before client uses it)
- Implement client code to use WCF service
Define WCF Service
- Open VS 2010 & Select new Project, then select WCF & select WCF Service Application & name it as WCF Rest Based.
- Now add new
Service
class to this application as “MyService.svc” - Open interface IMservice.cs & add the below code:
OperationContract
: PostSampleMethod
WebInvoke
Method Type = POST
as we are implementing POST
- URI Template defines the URL format by which this method is identified / linked.
Note: MethodName, URI Template name & Operation Contract names may not be same means they can be different PostSampleMethod
will accept XML string
as input in POST
method. Using Stream
as input parameter, we can de-serialize input data before using it.
[OperationContract(Name = "PostSampleMethod")]
[WebInvoke(Method = "POST",
UriTemplate = "PostSampleMethod/New")]
string PostSampleMethod(Stream data);
OperationContract
name: GetSampleMethod
WebGet
attribute defined method type is GET
- Need to include below namespaces:
System.ServiceModel.Web;
System.ServiceModel
System.Runtime.Serialization
System.IO
[OperationContract(Name = "GetSampleMethod")]
[WebGet(UriTemplate = "GetSampleMethod/inputStr/{name}")]
string GetSampleMethod(string name);
Open MyService.cs class and provide implementation for the methods defined in IMyService
Interface as shown below:
public string PostSampleMethod(Stream data)
{
StreamReader reader = new StreamReader(data);
string xmlString = reader.ReadToEnd();
string returnValue = xmlString;
return returnValue;
}
public string GetSampleMethod(string strUserName)
{
StringBuilder strReturnValue = new StringBuilder();
strReturnValue.Append(string.Format
("You have entered userName as {0}", strUserName));
return strReturnValue.ToString();
}
Define Configuration for WCF Service
- Open web.config as we need to define configuration for our WCF Service. If you want our service to be accessed as part of
webHttp
, then we need to define webHttpBinding
& mexHttpBinding
. - In
System.ServiceModel
defined configuration as shown below. To know details about the below config configuration, check out the URL: https://ch1blogs.cognizant.com/blogs/279850/2011/10/18/service-end-point-not-found/.
<services>
<service name="WcfRestBased.MyService"
behaviorConfiguration="myServiceBehavior" >
<endpoint name="webHttpBinding"
address=""
binding="webHttpBinding"
contract="WcfRestBased.IMyService"
behaviorConfiguration="webHttp"
>
</endpoint>
<endpoint name="mexHttpBinding"
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
Service Name: To find what's to be given, right click the service & select ViewMarkup
option.
Example, in my case, it is MyService.svc, look for Service
attribute & use the complete string
, in my case it is Service=”WcfRestBased.MyService”
.
behaviorConfiguration: can be any name but this will be again used when we define behavior settings, in my case it is myServiceBehavior
.
Endpoint for webHttpBinding
- endpoint name: should be
webHttpBinding
if you are configuring for web access - address: we can leave it empty
- binding: should be
webHttpBinding
- contract: should be
Namespace.Interfacename
. In my case, it is wcfRestBased.IMyService
- behaviorConfiguration: should be
webHttp
EndPoint for mexHttpBinding
These values should be same as shown above.
- Now define Service behavior as shown below in
System.ServiceModel
. “mySeriveBehavior
” name should match behaviorConfiguration
name defined in Service
tag (shown above):
<behaviors>
<serviceBehaviors>
<behavior name="myServiceBehavior" >
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior>
<!– 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>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
Smoke Test WCF Service
- Configure WCF Service in IIS
- To check our WCF service is working properly, let's test it by opening MyService.svc in browser, in my case it is http://localhost/wcfrestbased/MyService.svc
- To test our
GET
method service, you can call it by http://localhost/wcfrestbased/MyService.svc/GetSampleMethod/inputStr/suryaprakash & this shows up data as “<string>You have entered userName
as suryaprakash
”. - By this, we can confirm our service is working fine.
Implement Client Code to Use WCF Service
- Create new website application which will act as client to access WCF services.
- Add a
textbox
to default.aspx page & name it as txtResult
& open Default.aspx.cs - Define below function which will call rest service to fetch the data. This method will call
POSTSAMPLEMETHOD
in service (MyService
) implemented. Inline code comments are added.
void CallPostMethod()
{
string url =
"http://localhost/wcfrestbased/myservice.svc/PostSampleMethod/New";
ASCIIEncoding encoding = new ASCIIEncoding();
string strResult = string.Empty;
string SampleXml = @"<parent>" +
"<child>" +
"<username>username</username>" +
"<password>password</password>" +
"</child>" +
"</parent>";
string postData = SampleXml.ToString();
byte[] data = encoding.GetBytes(postData);
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
webrequest.Method = "POST";
webrequest.ContentType = "application/x-www-form-urlencoded";
webrequest.ContentLength = data.Length;
Stream newStream = webrequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse();
Encoding enc = System.Text.Encoding.GetEncoding("utf-8?);
// read response stream from response object
StreamReader loResponseStream =
new StreamReader(webresponse.GetResponseStream(), enc);
// read string from stream data
strResult = loResponseStream.ReadToEnd();
// close the stream object
loResponseStream.Close();
// close the response object
webresponse.Close();
// below steps remove unwanted data from response string
strResult = strResult.Replace("</string>", "");
strResult = strResult.Substring(strResult.LastIndexOf(’>
- Now let's go ahead and implement code to call
GETSAMPLEMETHOD
from client application. The below code has inline comments:
void CallGetMethod()
{
string url = "http://localhost/wcfrestbased/myservice.svc/
GetSampleMethod/inputStr/suryaprakash";
string strResult = string.Empty;
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
webrequest.Method = "GET";
webrequest.ContentType = "application/x-www-form-urlencoded";
HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse();
Encoding enc = System.Text.Encoding.GetEncoding("utf-8?);
// read response stream from response object
StreamReader loResponseStream = new StreamReader
(webresponse.GetResponseStream(), enc);
// read string from stream data
strResult = loResponseStream.ReadToEnd();
// close the stream object
loResponseStream.Close();
// close the response object
webresponse.Close();
// assign the final result to text box
txtResult.Text = strResult;
}
- Now go ahead and call the above methods to see the output of each method.
Happy coding… hope this helps!
History
- 29th October, 2011: Initial version