OK, ich habe es irgendwann selbst herausgefunden. Da ich es so schwer fand, eine komplette funktionierende Lösung im Internet zu finden, habe ich beschlossen, meine Arbeitslösung hier zu dokumentieren.
Eine JSONP-Antwort ist nur eine Standard-JSON-Zeichenfolge, die in einem Funktionsaufruf enthalten ist. ASP.NET scheint keine Möglichkeit zu bieten, die Antwort in diesem Format direkt zurückzugeben, aber es ist sehr einfach, dies selbst zu tun. Sie müssen jedoch die Standardmethode der JSON-Codierung überschreiben.
Im Folgenden finden Sie ein Beispiel für JSONP.
functionName({ name: 'value';});
..now dieses Bit: { name: 'value';}
ist nur Standard JSON, die jeder JSON Serializer Sie geben, so alles, was wir tun müssen, ist Tack auf dem Wrapper-Funktionsaufruf. Leider bedeutet dies, dass wir die vorhandene JSON-Codierung, die transparent vom Framework gehandhabt wird, wenn Sie ein Objekt von der Web-Service-Funktion zurückgeben, "unwirbeln" (oder umgehen) müssen.
Dies geschieht durch Überschreiben der Antwort von der Web-Service-Funktion vollständig durch Schreiben der JSONP in den Ausgabestream (Response) mit unserem eigenen Code. Das ist eigentlich ziemlich einfach und ich habe ein Beispiel unten eingefügt.
Sie können entweder den eingebauten DataContractJsonSerializer (aus dem Namespace System.Runtime.Serialization.Json in ASP.NET 3.5+) oder den NewtonSoft JSON Serializer verwenden, und beide Beispiele werden unten gezeigt. Ich bevorzuge die Verwendung der NewtonSoft JSON (installiert von Nuget) anstelle der eingebauten JSON-Serializer, wie ich finde es gibt Ihnen mehr Kontrolle und kann auch schön formatierte menschenlesbare JSON zum Debuggen ausgeben. Es ist auch viel schneller auf dem Papier!
[WebMethod()]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void GetData(int projectID, string callback)
{
List<Video> videos = null;
// <code here to populate list on line above>
// Method 1: use built-in serializer:
StringBuilder sb = new StringBuilder();
JavaScriptSerializer js = new JavaScriptSerializer();
sb.Append(callback + "(");
sb.Append(js.Serialize(videos));
sb.Append(");");
// Method 2: NewtonSoft JSON serializer (delete as applicable)
// StringBuilder sb = new StringBuilder();
// sb.Append(callback + "(");
// sb.Append(JsonConvert.SerializeObject(videos, Formatting.Indented)); // indentation is just for ease of reading while testing
// sb.Append(");");
Context.Response.Clear();
Context.Response.ContentType = "application/json";
Context.Response.Write(sb.ToString());
Context.Response.End();
}
Diese Methode kann dann Code mit dem folgende JQuery aufgerufen werden:
$.ajax({
crossDomain: true,
contentType: "application/json; charset=utf-8",
url: "http://examplewebsite.com/service.asmx/GetData",
data: { projectID: 1 }, // example of parameter being passed
dataType: "jsonp",
success: onDataReceived
});
function onDataReceived(data)
{
alert("Data received");
// Do your client side work here.
// 'data' is an object containing the data sent from the web service
// Put a JS breakpoint on this line to explore the data object
}
ich es nur mit einem ASP.Net Web-API auf dieser Basis getan haben: http://stackoverflow.com/a/9422178/585552 es Ihnen ein paar Ideen können ... – Greg
Versuchen Hinzufügen 'Antwort .AddHeader ("Access-Control-Allow-Origin", "*") 'im Hauptteil der Web-Methode – Icarus