Почему CORS ограничивает доступ к действию POST?
Всем привет. Есть сервис WEB API на .net core 2.1, в котором есть действие сохранения модели из формы:
[HttpPost("[action]")]
public async Task<IActionResult> Save([FromForm] Document document)
{
//Некоторые действия.
}
Так же есть клиентское приложение .net core mvc. Данные из формы к web api отправляет js. Код:
function SubmitForm(formData) {
let xhr = new XMLHttpRequest();
let form = new FormData(formData);
xhr.open('POST', 'http://localhost:57803/api/save');
xhr.onload = () => {
if (xhr.status == 200) {
alert('Все норм!');
}
else {
alert('Произошла ошибка!');
}
};
xhr.send(form);
};
Но при отправке этого запроса в консоли выпадает ошибка: Access to XMLHttpRequest at 'http://localhost:57803/api/save' from origin 'https://localhost:44377' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Хотя в классе StartUp web api указал следующее:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors(builder => { builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); });
app.UseMvc();
}
Так же стоит отметить, что есть метод удаления объекта в WEB API:
[HttpDelete("[action]/{id}")]
public async Task<IActionResult> Delete(int id)
{
//Некоторые действия.
}
И в клиентском приложении следующий код:
function deleteDoc(id, documentName) {
let xhr = new XMLHttpRequest();
xhr.open('DELETE', 'http://localhost:57803/api/delete/' + id);
xhr.onload = () => {
if (xhr.status == 200) {
deleteRow(id, documentName);
}
else {
errorDelete();
}
};
xhr.send();
};
Что странно, удаление отрабатывает нормально, а вот пост-запрос блокируется. Я уже не знаю куда копать, подскажите, пожалуйста.
Ответы (1 шт):
Cross-Origin Resource Sharing (CORS) — механизм, использующий дополнительные HTTP-заголовки, чтобы дать возможность агенту пользователя получать разрешения на доступ к выбранным ресурсам с сервера на источнике (домене), отличном от того, что сайт использует в данный момент. Говорят, что агент пользователя делает запрос с другого источника (cross-origin HTTP request), если источник текущего документа отличается от запрашиваемого ресурса доменом, протоколом или портом.
Некоторые запросы не заставляют срабатывать CORS preflight. Они называются “простыми запросами” в данной статье, хотя Fetch спецификация, определяющая CORS, не использует этот термин. Запрос, для которого не срабатывает CORS preflight— так называемый “простой запросы”—это запрос, удовлетворяющий следующим условиям:
Допустимые методы для запроса: GET HEAD POST
Далее для настройки Asp.Net core
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// ...
}
[EnableCors("MyPolicy")]
public void Configure(IApplicationBuilder app)
{
app.UseCors("MyPolicy");
// ...
// This should always be called last to ensure that
// middleware is registered in the correct order.
app.UseMvc();
}