This article illustrates how to call Windows Communication Foundation (WCF) services from your jQuery client code, and points out where special care is needed. Before you start reading and following this article, first read this blog entry which describes how to create a WCF service: Create, Host(Self Hosting, IIS hosting) and Consume WCF servcie
Step 1
Once you are done with creating the WCF service, you need to specify the attributes on the server type class for ASP.NET Compatibility mode, so that the WCF service works as a normal ASMX service and supports all existing ASP.NET features. By setting compatibility mode, the WCF service will have to be hosted on IIS and communicate with its client application using HTTP.
Read more about this in detail here: WCF Web HTTP Programming Object Model
Following line of code set ASP.NET Compatibility mode
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class Service : IService { // .....your code }
Service.Cs
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class Service : IService { public string GetData(int value) { return string.Format("You entered: {0}", value); } public string[] GetUser(string Id) { return new User().GetUser(Convert.ToInt32(Id)); } } public class User { Dictionary<int, string> users = null; public User() { users = new Dictionary<int, string>(); users.Add(1, "pranay"); users.Add(2, "Krunal"); users.Add(3, "Aditya"); users.Add(4, "Samir"); } public string[] GetUser(int Id) { var user = from u in users where u.Key == Id select u.Value; return user.ToArray<string>(); } }
Step 2
Next you need to specify attributes at operation level in the service contract file for each method or operation. To do this, decorate the method with WebInvoke, which marks a service operation as one that responds to HTTP requests other than GET. Accordingly, your operational level code in the contract file will be as follows:
[OperationContract] [OperationContract] [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] string[] GetUser(string Id);
As you can see in the code, sub-attributes having values to support calling via jQuery are marked with Method=post, so data gets posted to the service via a POST method.
ResponseFormat = WebMessaeFormat Json indicate data return as json format.
IService.cs
[ServiceContract] public interface IService { [OperationContract] [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)] string GetData(int value); [OperationContract] [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] string[] GetUser(string Id); }
Step 3
You need to change the default configuration created by Visual Studio in Web.Config file for WCF services, so that it works with the HTTP protocol request send by jQuery client code.
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="EndpBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> <services> <service behaviorConfiguration="ServiceBehavior" name="Service"> <endpoint address="" binding="webHttpBinding" contract="IService" behaviorConfiguration="EndpBehavior"/> </service> </services> </system.serviceModel>
As you can see in above config file, the EndPoint setting is changed, and EndPointBehaviors added to support WEBHTTP requests.
Note :
Endpoint settings done in the config works in conjunction with the WebInvoke attribute of the operation and the compatibility attribute set in ServiceType to support HTTP requests sent by jQuery.
Step 4
To consume web service using jQuery i.e to make call to WCF service you either use jQuery.ajax() or jQuery.getJSON(). For this I am using jQuery.ajax() method
To set the request, first define a variable. This will be helpful when you are calling multiple methods and creating a different js file to call the WCF service.
<script type="text/javascript">
var Type; var Url; var Data; var ContentType; var DataType; var ProcessData;
The following function initializes variables which are defined above to make a call to the service.
function WCFJSON() { var userid = "1"; Type = "POST"; Url = "Service.svc/GetUser"; Data = '{"Id": "' + userid + '"}'; ContentType = "application/json; charset=utf-8"; DataType = "json"; varProcessData = true; CallService(); }
CallService function sent request to service by setting data in $.ajax
//function to call WCF Service function CallService() { $.ajax({ type: Type, //GET or POST or PUT or DELETE verb url: Url, // Location of the service data: Data, //Data sent to server contentType: ContentType, // content type sent to server dataType: DataType, //Expected data format from server processdata: ProcessData, //True or False success: function(msg) {//On Successfull service call ServiceSucceeded(msg); }, error: ServiceFailed// When Service call fails }); } function ServiceFailed(result) { alert('Service call failed: ' + result.status + '' + result.statusText); Type = null; varUrl = null; Data = null; ContentType = null; DataType = null; ProcessData = null; }Note:
The following code checks the result.GetUserResult statement, so your result object gets the property your service method name + Result. Otherwise, it will give an error like object not found in Javascript.
function ServiceSucceeded(result) { if (DataType == "json") { resultObject = result.GetUserResult; for (i = 0; i < resultObject.length; i++) { alert(resultObject[i]); } } } function ServiceFailed(xhr) { alert(xhr.responseText); if (xhr.responseText) { var err = xhr.responseText; if (err) error(err); else error({ Message: "Unknown server error." }) } return; } $(document).ready( function() { WCFJSON(); } ); </script>
Summary
It is easy to call a WCF service from your client code you; just need to set your WCF service to serve requests through the HTTP protocol and set your client to consume it via the HTTP protocol.
gets unsupported media type error. Any idea what is causing that?
ReplyDeletehi pranayamr.blogspot.com-ers all the best to you all - matty
ReplyDeleteCould you upload your source code to github or something like that?, rapidshare link died .
ReplyDeleteThanks.
you can find article with same name on the code project site where you can also find code to download
Deleteyou can find article with same name on the code project site where you can also find code to download
ReplyDeleteHey,
ReplyDeleteI am having some trouble in fetching JSON string from WCF Service via JQuery.
http://stackoverflow.com/questions/9546338/unable-to-return-json-string-from-wcf-service-from-jquery#comment12097852_9546338
Please help.
Hey,
ReplyDeletePlease I am also having some trouble in getting this working.
http://stackoverflow.com/questions/10062425/unable-to-access-wcf-function-getting-error-405-method-not-allowed
you can find article with same name on the code project site where you can also find code to download
ReplyDeleteHow i can consume restful wcf service with https using jquery
ReplyDeletehere is the thing you wnat : http://pranayamr.blogspot.com/2011/03/rest.html
DeleteGood one
ReplyDeletehi, Great article, but this only works in IE in Chrome or Mozilla the ServiceFailed javascript method is fired.
ReplyDeletedo you know how to invoke wcf service from java code?
ReplyDeleteFantastic man...i am struggling from last 2 days to resolve this issue...thanks man..
ReplyDelete