ASP.NET Core 8 Web API + Ajax 调用控制器:完全禁用 Cors

问题描述 投票:0回答:1

我使用 .NET 8 和 Razor 创建了一个带有 API 的网站,并且我使用 AWS Elastik Beanstalk 托管我的网站。

我的网站允许创建和保存测试,从我这边来看,它运行得非常完美,不仅在开发模式下,而且在已发布的产品版本中也是如此。

来自印度的一个人试图帮助我加载测试,但它不断出现与 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,它也能工作,但不是来自印度。

我真的需要完全禁用Cors,并且我检查了很多SO线程都无济于事。

有什么帮助吗?

c# .net ajax cors asp.net-core-webapi
1个回答
0
投票

保单名称不同,请仔细核对。

enter image description here

建议

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。如果你想允许所有origin,你可以像下面这样设置。

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

    // add this line
    app.UseCors("CorsPolicy");
© www.soinside.com 2019 - 2024. All rights reserved.