ASP.NET Core 2 MVC全局异常处理无法正常工作

时间:2018-04-02 17:36:57

标签: c# asp.net-core asp.net-core-mvc

我目前正在开发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页面,因此无效。

1 个答案:

答案 0 :(得分:2)

状态代码页中间件在管道执行期间不能处理未处理的异常,但会检查响应状态代码(对于没有实体的响应)。

如果您将操作方法​​修改为此类操作,您将获得自定义错误页面:

 public async Task<IActionResult> Details(int id)
 {
    return new StatusCodeResult(500);
 }

对于异常处理,请查看UseExceptionHandler方法。例如:

app.UseExceptionHandler("/Error/CustomError/500");

注意,您可以在应用中同时使用UseExceptionHandlerUseStatusCodePagesWithReExecute