Pracuję nad stworzeniem nowego zestawu usług w ASP.MVC MVC 4 przy użyciu Web API. Jak dotąd jest świetnie. Utworzyłem usługę i uruchomiłem ją, a teraz próbuję ją wykorzystać za pomocą JQuery. Mogę odzyskać ciąg JSON za pomocą programu Fiddler i wydaje się, że jest to w porządku, ale ponieważ usługa istnieje w oddzielnej witrynie, próbuję wywołać ją z błędami JQuery z komunikatem „Niedozwolone”. Jest to więc oczywiście przypadek, w którym muszę używać JSONP.
Wiem, że interfejs API sieci Web jest nowy, ale mam nadzieję, że ktoś tam może mi pomóc.
Jak wywołać metodę interfejsu API sieci Web przy użyciu formatu JSONP?
jquery
jsonp
asp.net-mvc-4
asp.net-web-api
Brian McCord
źródło
źródło
Odpowiedzi:
Po zadaniu tego pytania w końcu znalazłem to, czego potrzebowałem, więc odpowiadam.
Natknąłem się na ten JsonpMediaTypeFormatter . Dodaj go do
Application_Start
swojego global.asax, wykonując następujące czynności:i dobrze jest przejść z wywołaniem JQuery AJAX, które wygląda następująco:
Wydaje się, że działa bardzo dobrze.
źródło
GlobalConfiguration.Configuration.AddJsonpFormatter(config.Formatters.JsonFormatter, "callback");
Oto zaktualizowana wersja JsonpMediaTypeFormatter do użytku z WebAPI RC:
źródło
Możesz użyć ActionFilterAttribute w następujący sposób:
Następnie włącz to do swojej akcji:
źródło
Z pewnością odpowiedź Briana jest poprawna, jednak jeśli już używasz programu formatującego Json.Net, który zapewnia ładne daty json i szybszą serializację, nie możesz po prostu dodać drugiego programu formatującego dla jsonp, musisz połączyć oba. Mimo wszystko warto go używać, ponieważ Scott Hanselman powiedział, że w wersji ASP.NET Web API domyślnie będzie używany serializator Json.Net.
źródło
Implementacja Ricka Strahla działała najlepiej dla mnie z RC.
źródło
JSONP działa tylko z żądaniem HTTP GET. Istnieje obsługa CORS w interfejsie API sieci Web asp.net, który działa dobrze ze wszystkimi zleceniami http.
Ten artykuł może być dla Ciebie pomocny.
źródło
Zaktualizowano
źródło
Oto zaktualizowana wersja z kilkoma ulepszeniami, która działa z wersją RTM interfejsów API sieci Web.
Accept-Encoding
nagłówków żądania . Wnew StreamWriter()
poprzednich przykładach po prostu używałby UTF-8. Wywołanie dobase.WriteToStreamAsync
może używać innego kodowania, co powoduje uszkodzenie danych wyjściowych.application/javascript
Content-Type
nagłówka; poprzedni przykład wyprowadziłby JSONP, ale zapplication/json
nagłówkiem. Ta praca jest wykonywana wMapping
klasie zagnieżdżonej (por. Najlepszy typ treści do obsługi JSONP? )StreamWriter
i bezpośrednio pobiera bajty i zapisuje je w strumieniu wyjściowym.ContinueWith
mechanizmu biblioteki zadań równoległych, aby połączyć kilka zadań razem.Kod:
Zdaję sobie sprawę z „zepsutości”
Func<string>
parametru w konstruktorze klasy wewnętrznej, ale był to najszybszy sposób obejścia problemu, który rozwiązuje - ponieważ C # ma tylko statyczne klasy wewnętrzne, nie widziCallbackQueryParameter
właściwości. PrzekazanieFunc
in wiąże właściwość w lambdzie, dzięki czemuMapping
będzie można uzyskać do niej dostęp późniejTryMatchMediaType
. Jeśli masz bardziej elegancki sposób, skomentuj!źródło
Niestety nie mam wystarczającej reputacji, aby komentować, więc opublikuję odpowiedź. @Justin poruszył problem uruchamiania programu formatującego WebApiContrib.Formatting.Jsonp wraz ze standardowym JsonFormatter. Ten problem został rozwiązany w najnowszej wersji (faktycznie wydanej jakiś czas temu). Powinien również działać z najnowszą wersją interfejsu API sieci Web.
źródło
Johperl, Thomas. Odpowiedź udzielona przez Petera Moberga powyżej powinna być poprawna dla wersji RC, ponieważ JsonMediaTypeFormatter, który dziedziczy z już korzysta z serializatora NewtonSoft Json, więc to, co ma, powinno działać bez żadnych zmian.
Jednak dlaczego, do licha, ludzie nadal używają naszych parametrów, skoro można po prostu wykonać następujące czynności
źródło
Zamiast hostować własną wersję programu formatującego JSONP , możesz zainstalować pakiet WebApiContrib.Formatting.Jsonp NuGet z już zaimplementowanym (wybierz wersję, która działa dla Twojego .NET Framework).
Dodaj ten formater do
Application_Start
:źródło
Dla tych z Was, którzy używają HttpSelfHostServer, ta sekcja kodu zakończy się niepowodzeniem w HttpContext.Current, ponieważ nie istnieje na własnym serwerze.
Możesz jednak przechwycić „kontekst” hosta własnego za pomocą tego nadpisania.
Request.Method da ci "GET", "POST" itp., A GetQueryNameValuePairs może pobrać parametr? Callback. Tak więc mój poprawiony kod wygląda następująco:
Mam nadzieję, że to pomoże niektórym z was. W ten sposób niekoniecznie potrzebujesz podkładki HttpContext.
DO.
źródło
Sprawdź to. Zobacz, czy to pomaga.
JSONP z interfejsem API sieci Web
źródło
Jeśli kontekst brzmi
Web Api
, dziękując i odnosząc się do010227leo
odpowiedzi, musisz rozważyćWebContext.Current
wartość, która będzienull
.Więc zaktualizowałem jego kod do tego:
źródło
Możemy rozwiązać problem CORS (współdzielenie zasobów między źródłami) na dwa sposoby,
1) Korzystanie z Jsonp 2) Włączanie Cors
1) Używając Jsonp - aby użyć Jsonp musimy zainstalować pakiet nuget WebApiContrib.Formatting.Jsonp i musimy dodać JsonpFormmater w WebApiConfig.cs, patrz zrzuty ekranu,
Kod JQuery
2) Włączanie Corsa -
aby włączyć cors, musimy dodać pakiet nuget Microsoft.AspNet.WebApi.Cors i włączyć cors w WebApiConfig.cs, patrz zrzut ekranu
Aby uzyskać więcej informacji, możesz polecić moje przykładowe repozytorium na GitHub, korzystając z poniższego linku. https://github.com/mahesh353/Ninject.WebAPi/tree/develop
źródło