相关文章推荐
开朗的路灯  ·  [UE]LNK1000 Internal ...·  5 月前    · 
气宇轩昂的豆腐  ·  Java Downloads | ...·  1 年前    · 

在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白。

如果在 Startup.cs 的 Configure() 中加上 app.UseStatusCodePages(); ,500错误时依然是一片空白(不知为何对500错误不起作用),404错误时有所改观,页面会显示下面的文字:

Status Code: 404; Not Found 

如果我们想实现不管500还是404错误都显示自己定制的友好错误页面,那该怎么办呢?

对于500错误,我们可以用 app.UseExceptionHandler() 进行截获;

对于404错误,我们可以用 app.UseStatusCodePages() 的增强版 app.UseStatusCodePagesWithReExecute() 进行截获;

然后转交给相应的URL进行处理。

app.UseExceptionHandler("/errors/500");
app.UseStatusCodePagesWithReExecute("/errors/{0}");

URL 路由到 MVC Controller 中显示友好错误页面。

public class ErrorsController : Controller
    [Route("errors/{statusCode}")]
    public IActionResult CustomError(int statusCode)
        if(statusCode == 404)
            return View("~/Views/Errors/404.cshtml");
        return View("~/Views/Errors/500.cshtml");
 

后来发现一个问题,当出现底层异常时,自定义错误页面不能显示,还是一片空白,比如下面的异常:

System.DllNotFoundException: Unable to load DLL 'System.Security.Cryptography.Native.Apple': The specified module could not be found.
 (Exception from HRESULT: 0x8007007E)

这时想到用 MVC 显示自定义错误页面的局限,如果发生的异常导致 MVC 本身不能正常工作,自定义错误页面就无法显示。

于是针对这个问题进行了改进,针对500错误直接用静态文件的方式进行响应,Startup.cs 的 Configure() 中的代码如下:

app.UseExceptionHandler(errorApp =>
    errorApp.Run(async context =>
        context.Response.StatusCode = 500;
        if (context.Request.Headers["X-Requested-With"] != "XMLHttpRequest")
            context.Response.ContentType = "text/html";
            await context.Response.SendFileAsync($@"{env.WebRootPath}/errors/500.html");
app.UseStatusCodePagesWithReExecute("/errors/{0}");

为了重用自定义错误页面,MVC Controller 中已进行了修改:

public class ErrorsController : Controller
    private IHostingEnvironment _env;
    public ErrorsController(IHostingEnvironment env)
        _env = env;
    [Route("errors/{statusCode}")]
    public IActionResult CustomError(int statusCode)
        var filePath = $"{_env.WebRootPath}/errors/{(statusCode == 404?404:500)}.html";
        return new PhysicalFileResult(filePath, new MediaTypeHeaderValue("text/html"));
                    在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白。如果在 Startup.cs 的 Configure() 中加上 app.UseStatusCodePages(); ,500错误时依然是一片空白(不知为何对500错误不起作用),404错误时有所改观,页面会显示下面的文字:Status Code: 404; No...
				
之前的博文 ASP.NET Core显示自定义错误页面 的方法是在项目硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取。 在这篇博文改用middleware实现,并且放在独立的项目发布成NuGet包,项目使用时只需安装NuGet包,然后在Startup的Configure()方法添加如下的一行代码。 app.UseCustomErrorPages(); 相信每位程序员们应该都知道在 ASP.NET Core ,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白。 如果在 Startup.cs 的 Configure() 加上 app.UseStatusCodePages(); ,500错误时依然是一片空白(不知为何对500错误不起作用),404错误时有所改观,页面显示下面的文字: Status Code: 404; Not Found 如果我们想实现不管500还是404错误显示自己定制的友好错误页面,那该怎么办呢? 对于500错误,我们可以用 app.UseExceptionHandle
异常是应用程序发生的运行时错误。 如果处理不当,将终止正在运行的程序。 我们如何防止这种情况发生? 我们可以使用全局异常处理程序来确保捕获所有未处理的异常。 为了在ASP.Net Core Web API实现全局异常处理,我们可以利用内置的间件UseExceptionHandler。 间件是插入到请求处理管道的软件组件,用于处理请求和响应。 [.Net路线图: .Net St...
此文是在官方文档的基础上做的个人笔记,一些简单的内容就没用再列出来了,参考官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/error-handling?view=aspnetcore-5.0 框架具有用于处理错误的内置功能,如: 开发人员异常页 自定义错误页 静态状态代码页 启动异常处理 1.异常处理lambda public void Configure(IApplicationBuilder app, IWebHost.
我们在使用某些系统的时候,如果访问了一个不存在的地址怎么办,比如http://52abp. com/airport/fly;或者访问的地址路由和操作方法虽然存在,但是地址参数id不存在,比如https://www.52abp.com/BlogDetails/5这个信息是存在的,但是更改访问https://www.52abp.com/BlogDetails/100时,则提示博客内容不存在。 在我们的系统要如何处理呢? 本章主要向读者介绍如下内容。 ASP.NET Core MVC的两种404错误
好的,你想了解 .NET Core 自定义间件。间件是 ASP.NET Core 应用程序处理 HTTP 请求和响应的组件。它们使用管道模式,其每个间件组件都按顺序执行,可以在管道执行特定的操作,例如验证身份、记录请求和响应等。以下是创建自定义间件的步骤: 1. 创建一个类并实现 `IMiddleware` 接口。 2. 在类实现 `InvokeAsync` 方法,该方法接收一个 `HttpContext` 对象和一个 `RequestDelegate` 委托对象。 3. 在 `InvokeAsync` 方法编写代码以处理请求和响应,并调用 `RequestDelegate` 委托对象来继续管道的下一个间件。 4. 在 `Startup.cs` 文件的 `Configure` 方法使用 `UseMiddleware<T>` 方法将自定义间件添加到管道,其 `T` 是自定义间件类的名称。 下面是一个示例代码: public class CustomMiddleware : IMiddleware public async Task InvokeAsync(HttpContext context, RequestDelegate next) // 在此处编写处理请求和响应的代码 await next(context); // Startup.cs 文件的 Configure 方法 public void Configure(IApplicationBuilder app) app.UseMiddleware<CustomMiddleware>(); 希望这可以帮助你了解如何创建自定义间件。