前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NetCore实现404和500状态码自定义处理页面

NetCore实现404和500状态码自定义处理页面

作者头像
code2roc
发布2023-07-19 14:46:12
2910
发布2023-07-19 14:46:12
举报

使用NerCore开发框架过程中需要对404,500等状态码进行友好提示页面处理,参照asp.net mvc并没有发现提供Application_Error和Application_BeginRequest方法,是用拦截器路由不匹配的情况下也不会进行拦截,但NetCore中在Microsoft.AspNetCore.Builder.UseExtensions中提供了Use扩展方法对HttpContext进行了拦截处理,这样我们就可以获取到Request和Response针对跳转进行处理,我们在Startup的Configure方法中加入如下代码,在404的情况同时可以处理访问项目时的默认路由跳转,例如访问http://localhost:4099/fastcloud时不加入具体主页面路由,则context.Request.Path为空,可以跳转我们默认制定的主页,

代码语言:javascript
复制
                //自定义404和500处理
                app.Use(async (context, next) =>
                {
                    await next();
                    if (context.Response.StatusCode == 404)
                    {
                        string FilePath = context.Request.Path;
                        if (string.IsNullOrEmpty(FilePath) || FilePath == "/")
                        {
                            context.Request.Path = "/" + AppConfigUtil.Configuration["Frame:DefaultHomeUrl"];
                        }
                        else
                        {
                            context.Request.Path = "/frame/home/error/404";
                        }
                        await next();
                    }
                    if (context.Response.StatusCode == 500)
                    {
                        context.Request.Path = "/frame/home/error/500";
                    }
                });

需要注意的是,如果在项目中加入的全局异常拦截器,则需要判断如果是页面请求,才会跳转至自定义500页面,Ajax请求返回错误的Json串,具体代码和效果如下

代码语言:javascript
复制
    public class GlobalExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            string FloderPath = CloudUtil.GetContentPath() + "/Logs";
            DirectoryInfo SystemLogDir = new DirectoryInfo(FloderPath);
            if (!SystemLogDir.Exists)
            {
                SystemLogDir.Create();
            }
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat("异常请求url:{0}", context.HttpContext.Request.Path + Environment.NewLine);
            builder.AppendFormat("异常信息:{0}", context.Exception.Message + Environment.NewLine);
            builder.AppendFormat("堆栈信息:{0}", context.Exception.StackTrace + Environment.NewLine);
            LogUtil.WriteLog(CloudUtil.GetContentPath() + "/Logs/Exception", "log_", builder.ToString());
            bool IsAjaxCall = context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest";
            if (IsAjaxCall)
            {
                context.Result = Result.Error("系统发生错误,请联系管理员!");
                context.ExceptionHandled = true;
            }
            else
            {
                context.Result = new RedirectResult(CloudUtil.GetRootPath() + "frame/home/error/500");
                context.ExceptionHandled = true;
            }

        }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档