这是我的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
有关此解决方案甚至有效的实际解释,请参阅上/下面的答案。谢谢泰勒。