@Stazhor

Почему 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 '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();
    };


Что странно, удаление отрабатывает нормально, а вот пост-запрос блокируется. Я уже не знаю куда копать, подскажите, пожалуйста.
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ответы на вопрос 1
@yuopi
C# developer
В ConfigureServices:
services.AddCors(options =>
            {
               options.AddPolicy("CorsPolicy", builder => builder
                    .SetIsOriginAllowed(e => true)
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
            });


В Configure:
app.UseCors("CorsPolicy");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы