I am trying to obtain the data for JQGrid from a WCF Web service that is running from within my ASP.NET 2.0 WebForms application. The problem is that the WCF Web service expects the data to be formatted as a JSON string, and JQGrid is performing an HTTP Post and passing it as Content-Type: application/x-www-form-urlencoded.
Although there appears to be several options for the format of data returned to JQGrid (it accepts JSON, XML, and others), there doesn't seem to be a way to alter the way it passes inputs to the web service.
So I'm trying to figure out how to tweak the WCF service so that it will accept
Content-Type: application/x-www-form-urlencoded
rather than
Content-Type:"application/json; charset=utf-8"
When I did a test using JQuery to send an Ajax request using url encoding (shown here):
$.ajax({
type: "POST",
url: "../Services/DocLookups.svc/DoWork",
data: 'FirstName=Howard&LastName=Pinsley',
contentType: "Content-Type: application/x-www-form-urlencoded",
dataType: "json",
success: function(msg) {
alert(msg.d);
}
});
the call fails. Using Fiddler to inspect the traffic, I found the error as returned by the server:
{"ExceptionDetail":{"HelpLink":null,"InnerException":null,"Message":
"The incoming message has an unexpected message format 'Raw'. The expected
message formats for the operation are 'Xml', 'Json'. This can be because
a WebContentTypeMapper has not been configured on the binding.
See the documentation of WebContentTypeMapper for more details."...
Note that this code DOES work due to the difference in encoding
$.ajax({
type: "POST",
url: "../Services/DocLookups.svc/DoWork",
data: '{"FirstName":"Howard", "LastName":"Pinsley"}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert(msg.d);
}
});
On the server, the service looks like:
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class DocLookups {
// Add [WebGet] attribute to use HTTP GET
[OperationContract]
public string DoWork(string FirstName, string LastName) {
return "Your name is " + LastName + ", " + FirstName;
}
}
and my web.config contains:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="DocLookupsAspNetAjaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="DocLookups">
<endpoint address="" behaviorConfiguration="DocLookupsAspNetAjaxBehavior"
binding="webHttpBinding" contract="DocLookups" />
</service>
</services>
</system.serviceModel>
Thanks for any help!