首页 > 解决方案 > 如何重定向到自定义错误处理程序页面

问题描述

我想要一个针对所有应用程序错误的通用错误页面。

我已按照指南在 ASP.NET 核心中创建自定义错误处理程序,这可以按预期捕获错误。但是,我看不到如何重定向到处理页面的通用错误。示例似乎集中在 Web API,而不是 UI。我有以下自定义错误处理代码

  private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        int exceptionId = ExceptionManager.Publish(exception);

        return context.Response.WriteAsync(new ErrorViewModel()
        {
            ExceptionId = exceptionId
        }.ToString());
    }

异常详细信息被记录到数据库并返回一个 Id。我有一个显示 Id 的控制器操作,以便用户可以报告它。

如何重定向到我的错误视图?

标签: asp.net-core

解决方案


在 Startup.cs 方法中,您需要调用 ExceptionHandlerMiddleware ,如下所示。

app.UseMiddleware(typeof(ExceptionHandlerMiddleware));

创建一个中间件类并编写以下代码

public class ExceptionHandlerMiddleware 
    { 
        private readonly RequestDelegate next; 
 
        public ExceptionHandlerMiddleware(RequestDelegate next) 
        { 
            this.next = next; 
        } 
 
        public async Task Invoke(HttpContext context) 
        { 
            try 
            { 
               //Write you logic
            } 
            catch (Exception ex) 
            { 
                await HandleExceptionAsync(context, ex); 
            } 
        } 
 
        private static async Task HandleExceptionAsync(HttpContext context, Exception exception) 
        { 
         
            context.Response.StatusCode = 500; 
            if (IsRequestAPI(context)) 
            { 
                //when request api 
                context.Response.ContentType = "application/json"; 
                await context.Response.WriteAsync(JsonConvert.SerializeObject(new 
                { 
                    State = 500, 
                    message = exception.Message 
                })); 
            } 
            else 
            { 
                //when request page 
                context.Response.Redirect("/Home/Errorpage"); 
            } 
        } 
    } 

中间件被“瀑布化”直到全部执行完毕,或者一个停止执行(在我们的异常处理的情况下,我们将编写我们的,以便它停止执行。稍后会详细介绍)。

传递给中间件的第一件事是请求委托。这是一个接受当前 HttpContext 对象并执行它的委托。您的中间件在创建时将其保存下来,并在 Invoke() 步骤中使用它。Invoke() 是完成工作的地方。作为中间件的一部分,您想要对请求/响应执行的任何操作都在这里完成。中间件的其他一些用途可能是基于标头授权请求或将标头注入请求或响应中。有关更多示例,请查看中间件文档。


推荐阅读