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 的控制器操作,以便用户可以报告它。
如何重定向到我的错误视图?
解决方案
在 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() 是完成工作的地方。作为中间件的一部分,您想要对请求/响应执行的任何操作都在这里完成。中间件的其他一些用途可能是基于标头授权请求或将标头注入请求或响应中。有关更多示例,请查看中间件文档。
推荐阅读
- java - 条件验证器不起作用,我该如何设置?
- tfs - TeamCity Nuget 仅更新私有包
- variables - SIMULINK 无法识别注释框中定义的变量 (Mablab 2018a)
- javascript - 如何在具有键数组的对象中查找值
- html - 在 Element UI 中禁用点击关闭模式
- python - 如何从具有多个分布的 seaborn 分布图中检索所有数据?
- maven - 无法在 groovy 项目上使用 build-helper-maven-plugin 运行测试
- lua - 需要操作系统,我错过了什么吗?
- go - 如何为服务器发送事件(SSE、EventStream)配置 IIS 的 HTTPPlatformHandler
- azure-managed-identity - 如何将托管标识添加到开发测试实验室 VM?