Я перепробовал все, что написано в этой статье: http://www.asp.net/web-api/overview/security/enpting-cross-origin-requests-in-web-api , но ничего не работает. Я пытаюсь получить данные из webAPI2 (MVC5) для использования в другом домене с помощью angularJS.
мой контроллер выглядит так:
namespace tapuzWebAPI.Controllers
{
[EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
[RoutePrefix("api/homepage")]
public class HomePageController : ApiController
{
[HttpGet]
[Route("GetMainItems")]
//[ResponseType(typeof(Product))]
public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
{
HomePageDALcs dal = new HomePageDALcs();
//Three product added to display the data
//HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));
List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
return items;
}
}
}
c#
asp.net-mvc
angularjs
asp.net-web-api
cors
Ноа Гани
источник
источник
Ответы:
Вам необходимо включить CORS в вашем веб-API . Более простой и предпочтительный способ включить CORS глобально - добавить в web.config следующее:
Обратите внимание, что все методы указываются индивидуально, а не используются
*
. Это потому, что при использовании возникает ошибка*
.Вы также можете включить CORS с помощью кода.
Обновление
Ниже NuGet требуется пакет:
Microsoft.AspNet.WebApi.Cors
.Затем вы можете использовать
[EnableCors]
атрибут в действиях или контроллерах, подобных этомуИли вы можете зарегистрировать его глобально
Вам также необходимо обрабатывать предварительные
Options
запросы сHTTP OPTIONS
запросами.Web API
необходимо ответить наOptions
запрос, чтобы подтвердить, что он действительно настроен для поддержкиCORS
.Чтобы справиться с этим, все, что вам нужно сделать, это отправить пустой ответ . Вы можете сделать это внутри своих действий или сделать это глобально следующим образом:
Эта дополнительная проверка была добавлена, чтобы гарантировать, что старые,
APIs
которые были разработаны только для приемаGET
иPOST
запросов, не будут использоваться. Представьте, что вы отправляетеDELETE
запросAPI
разработанному объекту, когда этого глагола не существует. Результат непредсказуем, а результаты могут быть опасными .источник
Ответ @ Mihai-Andrei Dinculescu верен, но в интересах поисковиков есть также тонкий момент, который может вызвать эту ошибку.
Добавление символа '/' в конце вашего URL-адреса остановит работу EnableCors во всех случаях (например, с домашней страницы).
Т.е. это не сработает
но это будет работать:
Эффект такой же, если используется атрибут EnableCors.
источник
Я выполнил все шаги, указанные Михаем-Андреем Динкулеску выше .
Но в моем случае мне понадобился еще один шаг, потому что http OPTIONS были отключены в Web.Config строкой ниже.
<remove name="OPTIONSVerbHandler" />
Я только что удалил его из Web.Config (просто прокомментируйте его, как показано ниже), и Cors работает как шарм
источник
Это может быть из-за установки пакетов Cors nuget.
Если вы столкнулись с проблемой после установки и включения cors из nuget, вы можете попробовать переустановить веб-Api.
В диспетчере пакетов запустите
Update-Package Microsoft.AspNet.WebApi -reinstall
источник
Попробуйте это, чтобы убедиться, что вы правильно настроили CORS:
Все еще не работает? Проверить наличие заголовков HTTP.
источник
config.EnableCors()
для этого тоже нужно.Чтобы заставить работать любой протокол CORS, вам необходимо иметь метод OPTIONS на каждой конечной точке (или глобальный фильтр с этим методом), который будет возвращать эти заголовки:
Причина в том, что браузер сначала отправит запрос OPTIONS, чтобы "протестировать" ваш сервер и увидеть авторизации.
источник
Ловлю очередной случай про корс. Может кому будет полезно. Если вы добавите на свой сервер функцию «Перенаправитель WebDav», запросы PUT и DELETE не будут выполнены.
Итак, вам нужно будет удалить WebDAVModule со своего сервера IIS:
Или добавьте в свой конфиг:
источник
Я знаю, что прихожу к этому очень поздно. Тем не менее, для всех, кто ищет, я подумал, что опубликую то, что НАКОНЕЦ сработало для меня. Я не утверждаю, что это лучшее решение - только то, что оно сработало.
Наша служба WebApi использует метод config.EnableCors (corsAttribute). Однако даже с этим он все равно не сможет выполнить предполетные запросы. @ Ответ Михая-Андрея Динкулеску дал мне ключ к разгадке. Прежде всего, я добавил его код Application_BeginRequest (), чтобы очистить запросы параметров. Это ВСЕ ЕЩЕ не работало для меня. Проблема в том, что WebAPI по-прежнему не добавлял ожидаемых заголовков в запрос OPTIONS. Одна только промывка не сработала, но это дало мне идею. Я добавил настраиваемые заголовки, которые в противном случае были бы добавлены через web.config в ответ на запрос OPTIONS. Вот мой код:
Очевидно, это относится только к запросам OPTIONS. Все остальные команды обрабатываются конфигурацией CORS. Если есть лучший подход к этому, я весь уши. Мне кажется, что это чит, и я бы предпочел, чтобы заголовки добавлялись автоматически, но это то, что наконец сработало и позволило мне двигаться дальше.
источник
@ Ответ Михая-Андрея Динкулеску работал у меня, например:
<httpProtocol>
в<system.webServer>
раздел web.configOPTIONS
запросы через указанныеApplication_BeginRequest()
вglobal.asax
За исключением того, что его проверка для
Request.Headers.AllKeys.Contains("Origin")
меня НЕ сработала, потому что запрос содержалoriging
строчные буквы. Я думаю, что мой браузер (Chrome) отправляет это для запросов CORS.Я решил это немного более обобщенно, используя регистрозависимость вариант его
Contains
проверки , вместо этого:if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {
источник
Если у вас есть узлы security \ requestFiltering в вашем web.config следующим образом:
убедитесь, что вы добавили это тоже
источник
Я перепробовал все, что мог найти в сети, включая методы, приведенные в этом ответе. После того, как я почти весь день пытался решить проблему, я нашел решение, которое сработало для меня как шарм.
в файле WebApiConfig в папке App_Start прокомментируйте все строки кода и добавьте следующий код:
источник
Я знаю, что люди, вероятно, сначала сочтут это очевидным, но на самом деле подумайте об этом. Это часто может случиться, если вы сделали что-то не так.
Например, у меня была эта проблема, потому что я не добавил запись хоста в свой файл hosts. Настоящая проблема заключалась в разрешении DNS. Или я просто неправильно указал базовый URL.
Иногда я получаю эту ошибку, если токен идентификации пришел с одного сервера, но я пытаюсь использовать его на другом.
Иногда вы получаете эту ошибку, если неправильно указали ресурс.
Вы можете получить это, если слишком поздно поместите промежуточное ПО CORS в цепочку.
источник
Избегайте включения CORS в нескольких местах, например, WebApiCOnfig.cs, метода GrantResourceOwnerCredentials в поставщике и атрибуте заголовка контроллера и т. Д. Ниже приведен список, который также вызывает разрешение контроля доступа.
Приведенного ниже кода более чем достаточно, чтобы исправить источник разрешения управления доступом. // Убедитесь, что app.UseCors должен быть в верхней части строки кода конфигурации.
Это замедлило мою проблему.
источник
Эта проблема возникает, когда вы пытаетесь получить доступ из другого домена или другого порта.
Если вы используете Visual Studio, перейдите в Инструменты> Диспетчер пакетов NuGet> Консоль диспетчера пакетов. Там вам нужно установить пакет NuGet Microsoft.AspNet.WebApi.Cors
Затем в PROJECT> App_Start> WebApiConfig включите CORS
После успешной установки создайте решение, и этого должно быть достаточно
источник