I've written a webservice which returns JSON and I've tried to call it using jQuery like this:
$.ajax({
contentType: "application/json; charset=utf-8",
url: "http://examplewebsite.com/service.asmx/GetData",
data: { projectID: 1 },
dataType: "jsonp",
success: function () {alert("success");}
});
However the code never calls the success function, despite the webservice call being successful when looking at the HTTP traffic using Fiddler. I think this is because my web service is returning raw JSON instead of JSONP.
How can I produce JSONP as the response from a standard .NET webservice method like this:
[WebMethod(), ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public Project GetData(int projectID)
{
Project p = new Project();
p.Name = "foobar";
return p;
}
Thanks.
OK, I've eventually figured it out myself. As I found it so hard to find a complete working solution on the web, I've decided to document my working solution here.
A JSONP response is just standard JSON string wrapped in a function call. ASP.NET doesn't seem to provide any way to return the reponse in this format directly, but it's very simple to do this yourself. You do though, have to override the default method of JSON encoding.
Below is an example of JSONP.
functionName({ name: 'value';});
..now this bit:
{ name: 'value';}
is just standard JSON that any JSON serializer will give you, so all we need to do is tack on the function call wrapper. Unfortunately, doing that means we have to 'unwire' (or bypass) the existing JSON encoding which is handled transparently by the framework when you return an object from the web service function.This is done by overriding the response from the web service function completely by writing the JSONP to the output stream (Response) using our own code. This is actually quite straightforward and I've included an example below.
You can use either the built in DataContractJsonSerializer (from the System.Runtime.Serialization.Json namespace in ASP.NET 3.5+) or the NewtonSoft JSON serializer, and both examples are shown below. I prefer to use the the NewtonSoft JSON (installed from nuget) rather than the built in JSON serializer as I find it gives you more control and also can output nicely formatted human readable JSON for debugging. It's also much faster on paper!
This method can then be called using the following JQuery code:
In case someone is looking for sample how to return
JSONP
fromASP.NET
Web API
action:JsonpResult
helper class encapsulating theJSONP
wrapping.Thanks Nick, that was an excellent answer to a problem that I too had a hard time finding at first online. Worked great for me as well.
Wanted to make sure this this line of post got the attention it deserves.
Just wanted to add that I used the built in serializer (System.Runtime.Serialization.Json) and it worked like a charm as well.