如何将我重定向到“自定义错误处理程序”页面

时间:2019-05-14 09:47:37

标签: asp.net-core

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

我已遵循指南在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的控制器操作,以便用户可以报告它。

如何重定向到错误视图?

1 个答案:

答案 0 :(得分:0)

在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()是完成工作的地方。作为中间件的一部分,您想要对请求/响应进行的操作都在这里完成。中间件的其他一些用法可能是基于标头授权请求,或将标头注入请求或响应中。有关更多示例,请查看Middleware documentation.