OK, w końcu sam to wymyśliłem. Ponieważ ciężko mi było znaleźć kompletne działające rozwiązanie w Internecie, zdecydowałem się tutaj udokumentować moje działające rozwiązanie.
Odpowiedź JSONP to tylko standardowy ciąg JSON zawinięty w wywołanie funkcji. ASP.NET nie wydaje się oferować żadnego sposobu zwracania odpowiedzi w tym formacie bezpośrednio, ale bardzo łatwo jest to zrobić samodzielnie. Musisz jednak zastąpić domyślną metodę kodowania JSON.
Poniżej znajduje się przykład JSONP.
functionName({ name: 'value';});
..now ten bit: { name: 'value';}
jest tylko standard JSON, że każdy serializer JSON da się, więc wszystko co musisz zrobić, to przyczepność na opakowaniu wywołania funkcji. Niestety, oznacza to, że musimy "odpiąć" (lub ominąć) istniejące kodowanie JSON, które jest obsługiwane w sposób przezroczysty przez strukturę, gdy zwracamy obiekt z funkcji usługi sieciowej.
Dokonuje się tego przez całkowite zastąpienie odpowiedzi z funkcji usługi sieciowej przez napisanie JSONP do strumienia wyjściowego (Response) przy użyciu naszego własnego kodu. Jest to całkiem proste i dodałem przykład poniżej.
Można użyć wbudowanego DataContractJsonSerializer (z obszaru nazw System.Runtime.Serialization.Json w ASP.NET 3.5+) lub serializera NewtonSoft JSON, a oba przykłady przedstawiono poniżej. Wolę korzystać z NewtonSoft JSON (zainstalowanego z nugetu) niż z wbudowanego serializatora JSON, ponieważ uważam, że daje on większą kontrolę, a także może wysyłać dobrze sformatowany czytelny dla użytkownika JSON do debugowania. Jest także znacznie szybszy na papierze!
[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();
}
Ta metoda może być nazywane przy użyciu następującego kodu jQuery:
$.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
}
Mam tylko zrobić z ASP.Net Web API opartego na to: http://stackoverflow.com/a/9422178/585552 może dać Ci kilka pomysłów ... – Greg
spróbuj dodać 'Response .AddHeader ("Access-Control-Allow-Origin", "*") 'w ciele metody internetowej – Icarus