Подтвердить что ты не робот

CORS POST Запросы не работают - ОПЦИИ (неверный запрос) - Происхождение не разрешено

У меня много проблем с получением запроса POST для перекрестного домена, чтобы попасть в контроллер Api в последней версии бета-версии 2.

Chrome (и другие браузеры) выплюнул:

OPTIONS http://api.hybridwebapp.com/api/values 400 (Bad Request)
POST http://api.hybridwebapp.com/api/values 404 (Not Found) 

Он может быть связан с этой проблемой, но я применил это обходное решение и ряд других исправлений, таких как web.config здесь

Я некоторое время стучал головой об этом, поэтому я создал решение, чтобы точно воспроизвести проблему.

Загрузите веб-приложение, там будет две кнопки для GET для POST, и ответ появится рядом с кнопкой. GET работает. Не удается вернуть POST.

enter image description here

Я могу получить намек на причину от Fiddler, но это бессмысленно, потому что если вы посмотрите на ответ, то он включает домен в заголовок Access-Controll-Allow-Origin:

enter image description here

В решении под названием "ConfigurationScreenshots" есть папка с несколькими скриншотами конфигурации IIS (привязки веб-сайтов) и конфигурациями свойств проекта, чтобы сделать это как можно проще, чтобы помочь мне:)

EDIT: не забудьте добавить эту запись в файл хоста (% SystemRoot%\system32\drivers\etc):

 127.0.0.1     hybridwebapp.com  api.hybridwebapp.com

** СТАТУС: ** Кажется, что некоторые браузеры, такие как Chrome, позволяют мне приступать к POST независимо от сообщения об ошибке в ответе OPTIONS (в то время как другие, такие как Firefox, не работают). Но я не считаю, что это решено.

Посмотрите на скриншоты Fidler запроса OPTIONS, у которого есть

Access-Control-Allow-Origin: http://hybridwebapp.com

И все же ошибка:

Происхождение http://hybridwebapp.com не разрешено

Это совершенно противоречиво, как будто он игнорирует заголовок.

4b9b3361

Ответ 1

Хорошо, я прошел мимо этого. Это должна быть самая странная проблема, с которой я когда-либо сталкивался. Здесь, как "решить" это:

  • Продолжайте жить, как обычно, до тех пор, пока внезапно из-за отсутствия запросов OPTIONS в этом домене не начнется возврат 200 OK (вместо 400 Bad Request), и POST никогда не произойдет (или, по крайней мере, похоже, что это не потому, что браузер проглатывает его )
  • Поймите, что ответ Fiddler OPTIONS загадочно содержит дубликаты для "Access-Control-Allow-XXX".
  • Попробуйте удалить следующую инструкцию от пользователя web.config, хотя вы четко помните, что пытались исправить предыдущую проблему, и она не работает:

Снимите это:

    <httpProtocol>
       <customHeaders>
         <remove name="X-Powered-By" />
         <add name="Access-Control-Allow-Origin" value="http://mydomain.com" />
         <add name="Access-Control-Allow-Headers" value="Accept, Content-Type, Origin" />
         <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
       </customHeaders>
    </httpProtocol>

Поскольку у вас уже есть это:

 var enableCorsAttribute = new EnableCorsAttribute("http://mydomain.com",
                                                   "Origin, Content-Type, Accept",
                                                   "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);

Мораль: вам нужен только один.

Ответ 2

если вы используете авторизацию OAuth. просьба не переходить прямо в веб-api. Вам необходимо включить поддержку OWIN CORS для этой конечной точки.

Как я делаю на своем сайте: Установите owin cors

Install-Package Microsoft.Owin.Cors

Примечание: не используйте: Install-Package Microsoft.AspNet.WebApi.Cors

В файле Startup.Auth.cs

 //add this line
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

            // Enable the application to use bearer tokens to authenticate users
            app.UseOAuthBearerTokens(OAuthOptions);

Ответ 3

Попробуйте добавить ниже код в заголовок Response:

Response.AddHeader("Access-Control-Allow-Origin", "*");

Ответ 4

Добавьте это в свой файл startup.cs внутри ConfigureOAuth

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

Ответ 5

У меня есть контроллер MVC (а не ApiController), но решение, которое я придумал, может помочь другим. Чтобы разрешить доступ к кросс-домену к действию POST (/data/xlsx) на контроллере, я выполнил 2 действия:

  • для проверки перед полетом
  • для сообщения

Если у вас нет действия HttpOptions, вы получите 404 в предполетной проверке.

код:

[HttpOptions]
public ActionResult Xlsx()
{
    // Catches and authorises pre-flight requests for /data/xlsx from remote domains
    Response.AddHeader("Access-Control-Allow-Origin", "*");
    Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    Response.AddHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS");
    return null;
}

[HttpPost]
public ActionResult Xlsx(string data, string name)
{
    Xlsx(); // Add CORS headers

    /* ... implementation here ... */
}

Я тестировал его в IE 11, Chrome, FireFox.