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 asString
& returns formattedString
.POST
method will take input as XML (user registration) & return statusstring
.
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 implementingPOST
- 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 XMLstring
as input inPOST
method. UsingStream
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 isGET
- 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);
4. Open
MyService.cs class and provide implementation for the methods defined
in
IMyService
Interface as
shown below: public string PostSampleMethod(Stream data)
{
// convert Stream Data to StreamReader
StreamReader reader = new StreamReader(data);
// Read StreamReader data as string
string xmlString = reader.ReadToEnd();
string returnValue = xmlString;
// return the XMLString data
return returnValue;
}
public string GetSampleMethod(string strUserName)
{
StringBuilder strReturnValue = new StringBuilder();
// return username prefixed as shown below
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 definewebHttpBinding
&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 iswcfRestBased.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 matchbehaviorConfiguration
name defined inService
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 “You have entereduserName
assuryaprakash
”. - 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 astxtResult
& 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()
{
// Restful service URL
string url =
“http://localhost/wcfrestbased/myservice.svc/PostSampleMethod/New“;
// declare ascii encoding
ASCIIEncoding encoding = new ASCIIEncoding();
string strResult = string.Empty;
// sample xml sent to Service & this data is sent in POST
string SampleXml = @”<parent>” +
“<child>” +
“<username>username</username>” +
“<password>password</password>” +
“</child>” +
“</parent>”;
string postData = SampleXml.ToString();
// convert xmlstring to byte using ascii encoding
byte[] data = encoding.GetBytes(postData);
// declare httpwebrequet wrt url defined above
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
// set method as post
webrequest.Method = “POST”;
// set content type
webrequest.ContentType = “application/x-www-form-urlencoded”;
// set content length
webrequest.ContentLength = data.Length;
// get stream data out of webrequest object
Stream newStream = webrequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
// declare & read response from service
HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse();
// set utf8 encoding
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()
{
// Restful service URL
string url = “http://localhost/wcfrestbased/myservice.svc/
GetSampleMethod/inputStr/suryaprakash“;
string strResult = string.Empty;
// declare httpwebrequet wrt url defined above
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
// set method as post
webrequest.Method = “GET”;
// set content type
webrequest.ContentType = “application/x-www-form-urlencoded”;
// declare & read response from service
HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse();
// set utf8 encoding
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.
http://www.codeproject.com/KB/WCF/DevelopWCFRestfulServices.aspx
No comments:
Post a Comment