Веб-API ASP.NET Core 8 + вызов Ajax к контроллеру: полностью отключить Cors

Я создал веб-сайт с API, используя .NET 8 и Razor, и размещаю свой веб-сайт с помощью AWS Elastic Beanstalk.

Мой веб-сайт позволяет создавать и сохранять тесты, и он отлично работает с моей стороны не только в режиме разработки, но и в опубликованной версии prod.

Один человек из Индии пытается помочь мне загрузить тесты, но он постоянно получает ошибки, связанные с Cors. Независимо от того, что я пытаюсь отключить Cors, он всегда получает ошибку при нажатии «Сохранить».

Что бы я ни пробовал - из разных потоков SO - всегда приводит к разным ошибкам, каждая из которых длиннее и запутаннее.

Это мой вызов jQuery Ajax для сохранения:

function saveTest() {
    var test = generateTestJson(true);

    if (test == Result.KO) 
        return false;

    toastMessage(Texts.processingData, InformationState.INFORMATION, true, Config.informationTimeout);

    var saveMode = SaveMode.Insert;

    if (selectedTestId != "") {   // Update
        saveMode = SaveMode.Update;
        testId = selectedTestId
    } else {   // Save
        //check for duplicates
        var testName = document.getElementById("Name").value;
        var testExists = ddlItemExists("ddlTests", testName);

        if (testExists) {
            toastMessage(Texts.testAlreadyExists.replace("%0", testName), InformationState.ERROR, false, Config.informationTimeout);
            return;
        }
    }

    var deletedElements = generateJsonDeletedElements();

    formData.delete('test');
    formData.delete('saveMode');
    formData.delete('deletedElements');
    //
    formData.append('test', test);
    formData.append('saveMode', saveMode);
    formData.append('deletedElements', deletedElements);

    $.ajax({
        url: '/Test/SaveTest',
        method: 'POST',
        contentType: false,
        processData: false,
        data: formData,
        success: function (data) {
            if (data.status == Result.OK) {
                selectedTestId = testId;
                formSubmitted = true;
                fillTestSelector();
            }
            showResultStatus(data.status, data.message);
        },
        error: function (xhr, status, error) {
            clearTimeout(informationTimer);
            showToast(xhr.responseText, InformationState.ERROR, false, true, "3");
        }
    })
}

Program.cs:

// ...
builder.Services.AddCors(options =>
{
   options.AddPolicy("MyPolicy",
       policy =>
       {
           policy
               .AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader()
               .SetIsOriginAllowed(origin => true); // allow any origin
       }
   );
});

var app = builder.Build();
    
app.UseAuthentication();
app.UseAuthorization();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseWebOptimizer();

// app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseCors("TestMePolicy");

var locOptions = app.Services.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);

app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Контроллер:

[HttpPost]
[EnableCors("MyPolicy")]
public async Task<JsonResult> SaveTest(string test, int saveMode, List<IFormFile> files, string deletedElements = "")

Самое неприятное, что он работает нормально из моего местоположения в Европе, но мой друг не может работать из Индии: всякий раз, когда он нажимает «Сохранить», выдается ошибка, связанная с Cors, метод контроллера, очевидно, не вызывается.

Также непонятно то, что с моей стороны работает даже без всего этого Program.cs кода для отключения Корса, но не из Индии.

Мне нужно полностью отключить Cors, и я безрезультатно проверил множество потоков SO.

Географическое несоответствие предполагает наличие проблем с кэшированием. Я не копал слишком глубоко, но это может быть связано с незаметной ошибкой в ​​промежуточном программном обеспечении CORS ASP.NET. Попробуйте удалить .SetIsOriginAllowed(origin => true); (что в любом случае принесет больше вреда, чем пользы), повторно разверните и подождите, пока изменения распространятся на вашего друга в Индии.

jub0bs 21.06.2024 07:51

Привет @jub0bs и спасибо за ответ. Я проверю и дам вам знать.

Diego Perez 21.06.2024 09:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Название политики отличается, проверьте его еще раз.

Предложения

1. Порядок промежуточного программного обеспечения очень важен, его следует изменить, как показано ниже.

var app = builder.Build();
//DELETE IT
//app.UseAuthentication();
//app.UseAuthorization();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseWebOptimizer();

// app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseCors("TestMePolicy");

var locOptions = app.Services.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
//DELETE IT
//app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

2. Если вы хотите разрешить все источники, вы можете установить их, как показано ниже.

    builder.Services.AddCors(options => options.AddPolicy("CorsPolicy", builder =>
    {
        builder.AllowAnyMethod()
            .SetIsOriginAllowed(_ => true)
            .AllowAnyHeader()
            .AllowCredentials();
    }));
    ...
    app.UseRouting();

    // add this line
    app.UseCors("CorsPolicy");

Привет @Jason Pan, и спасибо за твой ответ. Имя политики везде единое, просто я пытался скрыть имя своего приложения, поскольку оно является конфиденциальной информацией, и забыл изменить его в UseCors, глупая ошибка. Я проверю остальные предложения и сообщу вам, как все пойдет.

Diego Perez 21.06.2024 08:57

Привет @DiegoPerez. Попробуйте использовать предложение 2, оно должно сработать.

Jason Pan 21.06.2024 09:34

Другие вопросы по теме

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

(C#/.NET 8.0) Почему я не могу получать, а затем отправлять данные из UdpClients, созданных и используемых в отдельных потоках?
Как я могу получить указатель на управляемую функцию для предоставления неуправляемому коду в качестве обратного вызова?
Выполнение сценария PowerShell с аргументами из кода C#
Получение сообщения с помощью Azure.Messaging.ServiceBus, отправленного с помощью Microsoft.ServiceBus.Messaging (ServiceBus.v1_1)
Передача значений нескольких элементов управления через кнопку в WinUI 3
Функции Azure не принимают значение в кодировке URL-адреса в качестве параметра запроса?
Как выбрать отдельные элементы из таблицы по переменной, а затем присоединиться к другой таблице в LINQ
Установите для свойства высоты стиля кнопки в дизайне материала в XAML значение по умолчанию
Azure SignalR: ни один из транспортных средств, поддерживаемых клиентом, не поддерживается сервером
Angular 17 и dot net Core 8 – добавление Jwt при обновлении в аудиторию