我目前正在开发ASP.NET Core 2 MVC应用程序。我试图找出Startup.cs
中的全局异常处理是如何工作的。
到目前为止,我可以使用常规app.UseStatusCodePages()
中间件。
然而,当我尝试使用app.UseStatusCodePagesWithReExecute
在我的视图上显示HTTP状态代码时,我只获得了一个标准的HTTP 500页面,并且在我的错误中没有重定向到我的CustomError
操作控制器。
出于演示目的,我在生产环境中运行我的应用程序,而不是在开发中。
我在ValuesController中抛出错误。 ValuesController看起来像这样:
public class ValuesController : Controller
{
public async Task<IActionResult> Details(int id)
{
throw new Exception("Crazy Error occured!");
}
}
我的Startup.cs
看起来像这样:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Global Exception Handling, I run in Production mode
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else // I come into this branch
{
//app.UseExceptionHandler("/Error/Error");
// My problem starts here: I cannot redirect to my custom error method...
//there is only a standard http 500 screen
app.UseStatusCodePagesWithReExecute("/Error/CustomError/{0}");
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Values}/{action=Index}/{id?}");
});
}
最后,我的ErrorController看起来像这样:
public class ErrorController : Controller
{
public IActionResult CustomError(string code)
{
// I only want to get here in debug, to get the code
// unfortunately it never happens :/
return Content("Error Test");
}
}
不幸的是,我无法重定向到我的CustomError方法并根据异常获取HTTP状态代码。
只有标准的chrome HTTP 500页面,因此无效。
答案 0 :(得分:2)
状态代码页中间件在管道执行期间不能处理未处理的异常,但会检查响应状态代码(对于没有实体的响应)。
如果您将操作方法修改为此类操作,您将获得自定义错误页面:
public async Task<IActionResult> Details(int id)
{
return new StatusCodeResult(500);
}
对于异常处理,请查看UseExceptionHandler
方法。例如:
app.UseExceptionHandler("/Error/CustomError/500");
注意,您可以在应用中同时使用UseExceptionHandler
和UseStatusCodePagesWithReExecute
。