阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ASP.NET Core中显示自定义错误页面

149次阅读
没有评论

共计 1818 个字符,预计需要花费 5 分钟才能阅读完成。

在 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"));
    }        
}

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-01/139467.htm

正文完
星哥说事-微信公众号
post-qrcode
 1
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计1818字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中