未为核心 3.1 ASP.NET 的内部服务器错误响应设置 CORS 标头



这是我的CORS配置:

services.AddCors(options =>
{
options.AddPolicy(name: "AllowedOrigins",
policyBuilder =>
{
var urls = Configuration.GetSection("Host:AllowedOrigins").Get<List<string>>();
policyBuilder.WithOrigins(urls.ToArray())
.AllowAnyMethod()
.AllowAnyHeader()
.SetIsOriginAllowed((host) => true)
.AllowCredentials();
});
});

Configure方法中:

app.UseRouting();
app.UseCors("AllowedOrigins");
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});

对于内部服务器错误,响应中没有access-control-*标头。据我所知,这个问题应该从 ASP.NET Core 2.2开始修复。

我为 ASP.NET Core 3.1创建了一个问题,您可以跟踪该问题。

您需要在启动中显式调用app.UseExceptionHandler(...)

如果不这样做,则未经处理的异常会沿着调用堆栈一直冒泡到 Kestrel。 而且红隼没有打电话给与HttpContext.Response.OnStarting(...)挂钩的代表.CorsMiddleware(和许多其他中间件(使用OnStarting挂钩到向响应中添加信息。

.Net 5 WebAPI 项目中也有同样的问题,所以我想到 2022 年 MS 并没有真正解决它。

在我的情况下,默认行为的问题在于 AXIOS(前端库(不提供任何错误响应详细信息,除非存在 CORS 标头。不确定是浏览器问题还是库问题,但无论解决方案如何,响应中都包含 CORS。这也摆脱了控制台中的警告,这可能会让人们感到困惑,因为尽管发出警告 - 状态代码仍然是 500(它也让我感到困惑:)(。

无论如何,在遵循@TylerOhlsen的回答之后,这里似乎有所帮助:

app.UseExceptionHandler(exceptionHandlerApp =>
{
exceptionHandlerApp.Run(async context =>
{
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
});
});
app.UseCors(...);

您可能希望执行以下操作:

if (!env.IsProduction())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(exceptionHandlerApp =>
{
exceptionHandlerApp.Run(async context =>
{
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
});
});
}

有关UseExceptionHandler的一些详细信息如下:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-6.0

有关此解决方案甚至有效的实际解释,请参阅上/下面的答案。谢谢泰勒。

相关内容

最新更新