Я создал веб-сайт с 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.
Привет @jub0bs и спасибо за ответ. Я проверю и дам вам знать.





Название политики отличается, проверьте его еще раз.
Предложения
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, глупая ошибка. Я проверю остальные предложения и сообщу вам, как все пойдет.
Привет @DiegoPerez. Попробуйте использовать предложение 2, оно должно сработать.
Географическое несоответствие предполагает наличие проблем с кэшированием. Я не копал слишком глубоко, но это может быть связано с незаметной ошибкой в промежуточном программном обеспечении CORS ASP.NET. Попробуйте удалить
.SetIsOriginAllowed(origin => true);(что в любом случае принесет больше вреда, чем пользы), повторно разверните и подождите, пока изменения распространятся на вашего друга в Индии.