我使用 .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线程都无济于事。
有什么帮助吗?
保单名称不同,请仔细核对。
建议
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");