Ich arbeite daran, mithilfe der Web-API einen neuen Satz von Diensten in ASP.MVC MVC 4 zu erstellen. Bisher ist es großartig. Ich habe den Dienst erstellt und zum Laufen gebracht, und jetzt versuche ich, ihn mit JQuery zu nutzen. Ich kann die JSON-Zeichenfolge mit Fiddler zurückerhalten, und es scheint in Ordnung zu sein, aber da der Dienst auf einer separaten Site vorhanden ist, wird versucht, ihn mit JQuery-Fehlern mit "Nicht zulässig" aufzurufen. Dies ist also eindeutig ein Fall, in dem ich JSONP verwenden muss.
Ich weiß, dass die Web-API neu ist, aber ich hoffe, dass mir jemand da draußen helfen kann.
Wie rufe ich eine Web-API-Methode mit JSONP auf?
jquery
jsonp
asp.net-mvc-4
asp.net-web-api
Brian McCord
quelle
quelle
Antworten:
Nachdem ich diese Frage gestellt hatte, fand ich endlich, was ich brauchte, also beantworte ich sie.
Ich bin auf diesen JsonpMediaTypeFormatter gestoßen . Fügen Sie es folgendermaßen in die
Application_Start
Datei global.asax ein:und Sie können mit einem JQuery AJAX-Aufruf beginnen, der so aussieht:
Es scheint sehr gut zu funktionieren.
quelle
GlobalConfiguration.Configuration.AddJsonpFormatter(config.Formatters.JsonFormatter, "callback");
Hier ist eine aktualisierte Version des JsonpMediaTypeFormatter zur Verwendung mit WebAPI RC:
quelle
Sie können ein ActionFilterAttribute wie folgt verwenden:
Dann setzen Sie es auf Ihre Aktion:
quelle
Sicherlich ist Brians Antwort die richtige. Wenn Sie jedoch bereits den Json.Net-Formatierer verwenden, der Ihnen hübsche JSON-Daten und eine schnellere Serialisierung bietet, können Sie nicht einfach einen zweiten Formatierer für JSONP hinzufügen, sondern beide kombinieren. Es ist trotzdem eine gute Idee, es zu verwenden, da Scott Hanselman gesagt hat, dass bei der Veröffentlichung der ASP.NET-Web-API standardmäßig der Json.Net-Serializer verwendet wird.
quelle
Die Implementierung von Rick Strahl hat für mich mit RC am besten funktioniert.
quelle
JSONP funktioniert nur mit HTTP-GET-Anforderungen. Es gibt eine CORS-Unterstützung in der asp.net-Web-API, die mit allen http-Verben gut funktioniert.
Dieser Artikel kann für Sie hilfreich sein.
quelle
Aktualisiert
quelle
Hier ist eine aktualisierte Version mit mehreren Verbesserungen, die mit der RTM-Version von Web-APIs funktioniert.
Accept-Encoding
Headern der Anforderung aus . Dienew StreamWriter()
in den vorherigen Beispielen würden einfach UTF-8 verwenden. Der Aufruf vonbase.WriteToStreamAsync
kann eine andere Codierung verwenden, was zu einer beschädigten Ausgabe führt.application/javascript
Content-Type
Header zu. Das vorherige Beispiel würde JSONP ausgeben, jedoch mit demapplication/json
Header. Diese Arbeit wird in der verschachteltenMapping
Klasse ausgeführt (vgl. Bester Inhaltstyp für JSONP? )StreamWriter
und ruft die Bytes direkt ab und schreibt sie in den Ausgabestream.ContinueWith
Mechanismus der Task Parallel Library , um mehrere Aufgaben miteinander zu verketten, anstatt auf eine Aufgabe zu warten .Code:
Ich bin mir der "Hackiness" des
Func<string>
Parameters im Konstruktor der inneren Klasse bewusst , aber es war der schnellste Weg, um das Problem zu umgehen , das es löst - da C # nur statische innere Klassen hat, kann es dieCallbackQueryParameter
Eigenschaft nicht sehen . Durch das Übergeben desFunc
In wird die Eigenschaft im Lambda gebunden, sodassMapping
Sie später in darauf zugreifen könnenTryMatchMediaType
. Wenn Sie eine elegantere Art haben, kommentieren Sie bitte!quelle
Leider habe ich nicht genug Ruf, um einen Kommentar abzugeben, daher werde ich eine Antwort posten. @Justin hat das Problem angesprochen , den WebApiContrib.Formatting.Jsonp- Formatierer neben dem Standard-JsonFormatter auszuführen. Dieses Problem wurde in der neuesten Version behoben (die tatsächlich vor einiger Zeit veröffentlicht wurde). Außerdem sollte es mit der neuesten Web-API-Version funktionieren.
quelle
Johperl, Thomas. Die Antwort von Peter Moberg oben sollte für die RC-Version korrekt sein, da der JsonMediaTypeFormatter, von dem er erbt, bereits den NewtonSoft Json-Serializer verwendet, und daher sollte das, was er hat, ohne Änderungen funktionieren.
Warum um alles in der Welt verwenden die Menschen jedoch immer noch Parameter, wenn Sie nur Folgendes tun könnten?
quelle
Anstatt Ihre eigene JSONP-Formatierungsversion zu hosten, können Sie das WebApiContrib.Formatting.Jsonp NuGet-Paket mit einer bereits implementierten installieren (wählen Sie die Version aus, die für Ihr .NET Framework funktioniert).
Fügen Sie diesen Formatierer hinzu in
Application_Start
:quelle
Für diejenigen unter Ihnen, die den HttpSelfHostServer verwenden, schlägt dieser Codeabschnitt in HttpContext.Current fehl, da er auf dem Self-Host-Server nicht vorhanden ist.
Sie können jedoch den Selbstkontext des Selbsthosts über diese Überschreibung abfangen.
Die request.Method gibt Ihnen "GET", "POST" usw. und die GetQueryNameValuePairs können den Parameter? Callback abrufen. So sieht mein überarbeiteter Code aus:
Hoffe das hilft einigen von euch. Auf diese Weise benötigen Sie nicht unbedingt einen HttpContext-Shim.
C.
quelle
Schau dir das an. Sehen Sie, ob es hilft.
JSONP mit Web-API
quelle
Wenn der Kontext lautet
Web Api
, sich zu bedanken und auf die010227leo
Antwort zu verweisen , müssen Sie denWebContext.Current
Wert berücksichtigen , der sein wirdnull
.Also habe ich seinen Code folgendermaßen aktualisiert:
quelle
Wir können das CORS-Problem (Cross-Origin Resource Sharing) auf zwei Arten lösen:
1) Verwenden von Jsonp 2) Aktivieren der Cors
1) Mit Jsonp- zur Verwendung von Jsonp müssen wir das Nuget-Paket WebApiContrib.Formatting.Jsonp installieren und JsonpFormmater in WebApiConfig.cs hinzufügen.
JQuery-Code
2) Aktivieren der Cors -
Um die cors zu aktivieren, müssen wir das Microsoft.AspNet.WebApi.Cors-Nuget-Paket hinzufügen und cors in WebApiConfig.cs aktivieren. Siehe Screenshot
Weitere Informationen finden Sie in meinem Beispiel-Repo auf GitHub unter folgendem Link. https://github.com/mahesh353/Ninject.WebAPi/tree/develop
quelle