Recently I was working on a WCF service in which the requirements included creation of a restful WCF service that an Android application will consume as well as invocation of the same service in a .NET web application. I am assuming here that readers have a basic idea of what a WCF REST service is.
My service returned data in JSON format when I was invoking it from mobile applications. It was working fine but in .NET applications I was using an ajax call via jQuery; it was giving the error "Cross Platform Invocation". I tried with JSONP too but as expected that did not work either so I decided to call it from the C# code I am providing and explaining here.
My service contract has one GET Request function returning a class in JSON format that is as follows:
[OperationContract]
[WebGetAttribute(UriTemplate = "/Track/{Sno}",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
Tracker Track(string Sno)
And my data contract Tracker class is as follows:
[DataContract]
public class Tracker
{
[DataMember]
public string Origin { get; set; }
[DataMember]
public string Destination { get; set; }
[DataMember]
public string NumberPiece { get; set; }
[DataMember]
public string GrossWeight { get; set; }
[DataMember]
public string VolumeWight { get; set; }
[DataMember]
public string ChargableWeight { get; set; }
[DataMember]
public string ConsigneeName { get; set; }
[DataMember]
public string ShipperName { get; set; }
}
The logic is simple in the service class function based on the sno I was executing a query in the database binding it to the class and returning it.
Until now we have talked about the service. From here the actual game starts. In the calling application I made a class and declared a field, Sno, that will be sent to the service.
public class WebTracking
{
public string Sno { get; set; }
}
Now, since the service is returning a class with string values, to receive it I made one more class and declared all the fields that I declared in the Tracker class of the service as in the following:
public class ResponseObj
{
public string Origin { get; set; }
public string Destination { get; set; }
public string NumberPiece { get; set; }
public string GrossWeight { get; set; }
public string VolumeWight { get; set; }
public string ChargableWeight { get; set; }
public string ConsigneeName { get; set; }
public string ShipperName { get; set; }
}
Now to call the service and receive the data. Let's make one more class here with one function as in the following:
public class TrackingRequest
{
public ResponseObj GetTracking(WebTracking info)
{
ResponseObj recoveredList = null;
string uri = "http://localhost/Tracking/Track.svc/TrackShipment/" + info.Sno;
HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest;
req.KeepAlive = false;
req.Method = "GET";
HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
Encoding enc = System.Text.Encoding.GetEncoding(1252);
StreamReader loResponseStream = new StreamReader(resp.GetResponseStream(), enc);
string Response = loResponseStream.ReadToEnd();
JavaScriptSerializer serializer = new JavaScriptSerializer();
recoveredList = serializer.Deserialize<ResponseObj>(Response);
loResponseStream.Close();
resp.Close();
return recoveredList;
}
}
Since the service is on a local IIS and the method is of a GET REQUEST type I am sending the parameter in the URL,calling the service with HTTP WEBREQUEST and receiving the response in a HTTP WEB RESPONSE object. In the next step I am reading the response stream into a stream reader object and converting it into the string. Until now the exact JSON string is retrieved. Now to convert this JSON string into the Class response object I deserialize it and assigned it to the ResponseObject's object and returned it.
Call it from the page as in the following:
WebTracking wt=new WebTracking();
Wt.Sno="30";
ResponseObj Obj=new ResponseObj();
TrackingRequest Tr=new TrackingRequest();
Obj=Tr. GetTracking(wt);
In the next article I will explain how to POST data to the service and receive the response .