【发布时间】:2020-02-22 01:56:51
【问题描述】:
我的错误处理设置如下:
Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<ExceptionHandlerMiddleware>();
app.UseStatusCodePagesWithReExecute("/Error/Index");
//I Added this as a test but it had no effect.
app.Use((context, next) => {
context.SetEndpoint(null);
return next();
});
app.UseStaticFiles(new StaticFileOptions()
{
OnPrepareResponse = (context) =>
{
context.Context.Response.GetTypedHeaders()
.CacheControl = new CacheControlHeaderValue
{
MaxAge = TimeSpan.FromDays(30)
};
}
});
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
现在我通过尝试类似 localhost/mynotexistantpage 的方法对此进行了测试,它可以工作,我得到了我的错误页面。实际上,在大多数情况下,当我对此进行测试时,我得到了错误页面。但是有一种情况我没有得到那个页面。
如果您创建了一个发布操作(实际上是任何操作)并需要一个防伪令牌。现在,如果您向该方法提交表单,但在您的 html 中删除自动生成的防伪令牌,服务器会以 400 状态响应,并且不使用我的错误页面。我得到的页面是浏览器默认的页面,如果你不提供的话。
附加说明:我的异常处理程序甚至没有捕捉到这个错误。处理程序构造函数看起来像这样:
public async Task Invoke(HttpContext context)
{
try
{
await _requestDelegate.Invoke(context);
}
catch (Exception exception)
{
HandleExceptionAsync(context, exception);
}
}
为什么会这样?当涉及到错误处理时,我该如何考虑所有情况?
【问题讨论】:
-
您发现了一个错误。我一直在研究这个,发现问题是因为 rexecute 回到了同一个端点。这是因为要使用的端点已经被选中,并且没有被清除以重新执行。
-
建议的解决方法如下:github.com/aspnet/AspNetCore/issues/…。
-
@KirkLarkin 我尝试了解决方法,但这并没有改变我的任何事情。我仍然收到 400 响应,并且页面上的内容显示:“此页面无法正常工作”,看起来像是由浏览器生成的,它没有加载我的实际错误页面。
标签: c# asp.net-core error-handling .net-core asp.net-core-3.0