如何绕过.NET Core 2.2和3.1错误处理并显示标准IIS状态代码页?



在 Asp.NET Core 2.2和3.1中,Startup类中有一个名为Configure((的方法,您可以在其中声明要使用的异常处理方法。例如,如果要在发生异常时发送自定义响应,则可以执行以下操作:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHttpContextAccessor accessor, IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider)
{
app.UseExceptionHandler(delegate (IApplicationBuilder errorApp)
{
errorApp.Run(async delegate (HttpContext Context)
{
Context.Response.StatusCode = 500;
Context.Response.ContentType = "text/plain";
await Context.Response.WriteAsync("An error occurred.");
});
});
//var x = ((string)null).Length; <--if this is uncommented, the custom handler won't catch it
//other configuration settings go here
}

Asp.Net Core 将默认为标准开发人员例外页,如果未定义自定义处理程序,则会显示异常的所有详细信息。

我的问题是,如何禁用 .Net Core开发人员异常页面自定义异常处理程序,并仅将错误冒泡到 IIS,以便显示老式错误页面?

想要这样做的原因是,在 Configure(( 方法中定义的自定义处理程序只有在 Configure(( 方法完成后才会生效。这意味着 Configure(( 方法中发生的任何异常(请参阅示例中注释掉的行(都会向用户发送一个成熟的开发人员错误页面,并且(据我研究(没有办法禁用这个详细的开发人员页面。

显然,我不希望这些错误详细信息出现在生产站点上。我认为完全禁用 Asp.NET Core 错误处理机制将允许使用标准 IIS 错误页面 100% 控制异常。

如果您不更改任何配置并将其保留为默认值,我假设您在进程内模式下使用 IIS 运行 .NET Core。您可以尝试disableStartUpErrorPage本指南。

请记住,进程内意味着您的 .NET Core 进程与 IIS 在同一进程中运行,因此每当出现启动异常时,它都会回退到Program.Main中,而不是在您的ExceptionHandler委托中。这就是用户可以看到完整堆栈跟踪的原因。

最新更新