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 не разрешено
Это совершенно противоречиво, как будто он игнорирует заголовок.
Ответы
Ответ 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.