Я работаю над созданием нового набора сервисов в ASP.MVC MVC 4 с использованием Web API. Пока это здорово. Я создал сервис и заставил его работать, и теперь я пытаюсь использовать его с помощью JQuery. Я могу вернуть строку JSON с помощью Fiddler, и, похоже, все в порядке, но поскольку служба существует на отдельном сайте, я пытаюсь вызвать ее с ошибками JQuery с помощью «Not Allowed». Итак, это тот случай, когда мне нужно использовать JSONP.
Я знаю, что веб-API является новым, но я надеюсь, что кто-то может мне помочь.
Как сделать вызов метода Web API с использованием JSONP?
jquery
jsonp
asp.net-mvc-4
asp.net-web-api
Брайан МакКорд
источник
источник
Ответы:
Задав этот вопрос, я наконец-то нашел то, что мне было нужно, поэтому отвечаю на него.
Я столкнулся с этим JsonpMediaTypeFormatter . Добавьте его в
Application_Start
ваш global.asax, выполнив это:и вы можете использовать вызов JQuery AJAX, который выглядит следующим образом:
Кажется, работает очень хорошо.
источник
GlobalConfiguration.Configuration.AddJsonpFormatter(config.Formatters.JsonFormatter, "callback");
Вот обновленная версия JsonpMediaTypeFormatter для использования с WebAPI RC:
источник
Вы можете использовать ActionFilterAttribute следующим образом:
Тогда поместите это в свое действие:
источник
Конечно, ответ Брайана правильный, но если вы уже используете форматтер Json.Net, который дает вам симпатичные даты json и более быструю сериализацию, то вы не можете просто добавить второй форматер для jsonp, вам нужно объединить их. В любом случае, это хорошая идея, поскольку Скотт Хансельман сказал, что в выпуске ASP.NET Web API по умолчанию будет использоваться сериализатор Json.Net.
источник
Реализация Rick Strahl лучше всего сработала для меня с RC.
источник
JSONP работает только с HETP GET-запросом. В веб-интерфейсе asp.net есть поддержка CORS, которая хорошо работает со всеми глаголами http.
Эта статья может быть полезна для вас.
источник
обновленный
источник
Вот обновленная версия с несколькими улучшениями, которая работает с RTM-версией веб-API.
Accept-Encoding
заголовках запроса . Вnew StreamWriter()
предыдущих примерах будет просто использовать UTF-8. Вызовbase.WriteToStreamAsync
может использовать другую кодировку, что приведет к повреждению вывода.application/javascript
Content-Type
заголовком; предыдущий пример вывел бы JSONP, но сapplication/json
заголовком. Эта работа выполняется во вложенномMapping
классе (ср. Лучший тип контента для обслуживания JSONP? )StreamWriter
и напрямую получает байты и записывает их в выходной поток.ContinueWith
механизм параллельной библиотеки задач, чтобы объединить несколько задач в цепочку.Код:
Мне известно о «хакерстве»
Func<string>
параметра во внутреннем конструкторе классов, но это был самый быстрый способ обойти решаемую проблему - поскольку в C # есть только статические внутренние классы, он не может видетьCallbackQueryParameter
свойство. ПередачаFunc
in связывает свойство в лямбде, такMapping
что вы сможете получить к нему доступ позжеTryMatchMediaType
. Если у вас есть более элегантный способ, пожалуйста, прокомментируйте!источник
К сожалению, у меня недостаточно репутации, чтобы комментировать, поэтому я выложу ответ. @Justin поднял вопрос о запуске форматера WebApiContrib.Formatting.Jsonp вместе со стандартным JsonFormatter. Эта проблема решена в последней версии (фактически выпущенной некоторое время назад). Кроме того, он должен работать с последней версией веб-API.
источник
Йохперл, Томас Ответ, данный Питером Мобергом выше, должен быть верным для RC-версии, поскольку JsonMediaTypeFormatter, от которого он наследует, уже использует сериализатор Json NewtonSoft, и поэтому то, что у него есть, должно работать без каких-либо изменений.
Однако, почему люди все еще используют параметры, когда вы могли бы просто сделать следующее
источник
Вместо размещения собственной версии средства форматирования JSONP вы можете установить пакет NuGet WebApiContrib.Formatting.Jsonp с уже реализованным (выберите версию, которая подходит для вашего .NET Framework).
Добавьте этот форматер в
Application_Start
:источник
Для тех из вас, кто использует HttpSelfHostServer, этот раздел кода не будет работать на HttpContext.Current, так как он не существует на самом хост-сервере.
Однако вы можете перехватить "контекст" собственного хоста через это переопределение.
Метод request.Method выдаст вам «GET», «POST» и т. Д., А GetQueryNameValuePairs может получить параметр? Callback. Таким образом, мой пересмотренный код выглядит так:
Надеюсь, это поможет некоторым из вас. Таким образом, вам не обязательно нужна прокладка HttpContext.
C.
источник
Проверьте это. Посмотрите, поможет ли это.
JSONP с веб-API
источник
Если контекст
Web Api
, благодаря и ссылаясь на010227leo
ответ, вы должны учитыватьWebContext.Current
значение, которое будетnull
.Поэтому я обновил его код так:
источник
Мы можем решить проблему CORS (совместного использования ресурсов из разных источников) двумя способами:
1) Использование Jsonp 2) Включение Cors
1) Используя Jsonp - для использования Jsonp нам нужно установить пакет nuget WebApiContrib.Formatting.Jsonp и добавить JsonpFormmater в WebApiConfig.cs со ссылками на скриншоты,
Код Jquery
2) Включение Cors -
Чтобы включить Cors, нам нужно добавить пакет nuget Microsoft.AspNet.WebApi.Cors, и нам нужно включить Cors в WebApiConfig.cs. Смотрите скриншот.
Для получения дополнительной информации вы можете обратиться к моему примеру репозитория на GitHub, используя следующую ссылку. https://github.com/mahesh353/Ninject.WebAPi/tree/develop
источник