Ответ 1
Проблема заключалась в том, что в обработке обработки запроса POST было исключение, и, как отметил Norgerman, обработчик исключений по умолчанию очистил заголовки CORS.
У меня есть ASP.NET 5 Web API (ну, во всяком случае, MVC), который я потребляю с помощью axios в моем приложении JS.
Конфигурация My CORS в MVC следующая:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddCors();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors(builder => {
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
});
}
Иными словами, я должен разрешить любой запрос. Однако, хотя эти исправленные запросы предполетных запросов, запросы POST по-прежнему отклоняются (я вижу, что он выполняется на сервере, но в ответе нет заголовка, что приводит к ошибке на стороне клиента).
Есть ли у кого-нибудь идеи, почему это не сработает?
Это заголовки, возвращаемые MVC api:
Проблема заключалась в том, что в обработке обработки запроса POST было исключение, и, как отметил Norgerman, обработчик исключений по умолчанию очистил заголовки CORS.
Вы должны добавить Cors перед MVC. Порядок регистрации промежуточного программного обеспечения важен. Если Cors зарегистрирован после mvc, он никогда не будет вызван. Они вызываются в порядке регистрации.
Как только процесс обрабатывает запрос, он передаст его следующему промежуточному программному обеспечению (Mvc)
Это работает для меня:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials());
}
@Норгерман упомянул об этом в комментариях, но я думаю, что это достойно ответа, потому что я сделал эту ошибку сам несколько раз:
Средство промежуточного программного обеспечения CORS работает только с фактическими междоменными запросами
Урок не, если вы просто обращаетесь к одному и тому же запросу домена, например, введя URL-адрес в браузер.
Это означает, что если вы тестируете, вам нужно либо использовать фактический кросс-доменный запрос от клиента XHR на другом порту или домене, либо HTTP-клиент, который может явно вызывать заголовок origin
в HTTP-запрос.
Предполагая, что вы пытаетесь создать действительно ОБЩЕСТВЕННУЮ конечную точку, это сработало для меня:
Убедитесь, что это:
app.UseCors(builder => {
builder.AllowAnyOrigin()
builder.AllowAnyMethod()
builder.AllowAnyHeader()
});
Происходит перед любым из них:
app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseCookiePolicy();
app.useMvc();
Помните, мы имеем дело с "конвейером". Материал Cors должен быть первым.
Также - (опять же, я полагаю, "публичная конечная точка") - убедитесь, что ваш вызов XHR имеет... xhr.withCredentials = false;
... или просто опустить это. Если для него установлено значение "true", вы получите предупреждение CORS о "подстановочном знаке".
Это то, что сработало для меня, так как у меня была такая же проблема с CORS в сочетании с axios.
Предполагая, что вы правильно настроили API и украсили класс в контроллере API:
[EnableCors("YourCorsPolicy")]
(вам нужно будет добавить выражение "using Microsoft.AspNetCore.Cors;" и в ваш класс)
Затем вам нужно использовать следующее в вашем файле axios-auth.js:
axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'
Это тогда работало хорошо для меня по https. Это мой полный axios-auth, если вам нужно руководство.
import axios from 'axios'
const instance = axios.create({
baseURL: 'https://localhost:56799/api'
})
axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'
axios.defaults.headers.get['Accepts'] = 'application/json'
axios.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8'
export default instance
Я надеюсь, что это полезно.
Обратите внимание, что брандмауэр Windows и проект .vs\config\applicationhost.config
должны быть правильно настроены, кроме включения CORS в вашем проекте. Контрольный список ниже может помочь:
Является ли порт, используемый вашим приложением /API открытым в брандмауэре? Если нет, откройте его.
Откройте файл проекта .vs\config\applicationhost.config
и выполните поиск <binding protocol="http" bindingInformation="*:NNNNN:localhost" />
(где NNNNN - номер IP-порта, используемого вашим приложением /API ). После этого добавьте вторую строку, <binding protocol="http" bindingInformation="*:NNNNN:*" />
, чтобы вы разрешили любому IP-адресу получать доступ к вашему приложению.
Перезагрузите IIS Express и помните, что часто выполняемая Visual Studio в качестве администратора важна.
После этого продолжите настройку и тестирование CORS.