博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net mvc输出自定义404等错误页面,非302跳转
阅读量:7106 次
发布时间:2019-06-28

本文共 3330 字,大约阅读时间需要 11 分钟。

 

朋友问到一个问题,如何输出自定义错误页面,不使用302跳转。当前页面地址不能改变.

还要执行一些代码等,生成一些错误信息,方便用户提交反馈.

500错误,mvc框架已经有现成解决方法:

filters.Add(new HandleErrorAttribute());

404错误目前想到的解决方法:

先上代码 Global.asax:

1 protected void Application_Error(object sender, EventArgs e) 2         { 3             var ex = Server.GetLastError() as HttpException; 4             if (ex == null) 5                 return; 6  7             var httpStatusCode = ex.GetHttpCode(); 8  9             if (httpStatusCode == 404)10             {11                 var httpContext = (sender as MvcApplication).Context;12 13                 httpContext.ClearError();14                 httpContext.Response.Clear();15                 httpContext.Response.StatusCode = 404;16                 ServiceFocus.LogService.AddLog(ex);17 18                 httpContext.Response.ContentType = "text/html; charset=utf-8";19                 var routeData = new RouteData();20                 routeData.Values["controller"] = "Sys";21                 routeData.Values["action"] = "NotFound";22                 var requestContext = new RequestContext(new HttpContextWrapper(httpContext), routeData);23                 var controller = ControllerBuilder.Current.GetControllerFactory().CreateController(requestContext, "Sys") as SysController;24                 //controller.ViewData.Model=model;25                 (controller as IController).Execute(requestContext);26                 ControllerBuilder.Current.GetControllerFactory().ReleaseController(controller);27             }
View Code

 

controller代码:
1 public class CompressAttribute : ActionFilterAttribute 2     { 3         public override void OnActionExecuting(ActionExecutingContext filterContext) 4         { 5             var acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; 6             if (!string.IsNullOrEmpty(acceptEncoding)) 7             { 8                 acceptEncoding = acceptEncoding.ToLower(); 9                 var response = filterContext.HttpContext.Response;10                 if (acceptEncoding.Contains("gzip"))11                 {12                     response.AppendHeader("Content-encoding", "gzip");13                     response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);14                 }15                 else if (acceptEncoding.Contains("deflate"))16                 {17                     response.AppendHeader("Content-encoding", "deflate");18                     response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);19                 }20             }21         }22     }23     [Compress]24     public class SysController : Controller25     {26         //27         // GET: /sys/28 29         public ActionResult NotFound()30         {31             return View();32         }33         public ActionResult Error()34         {35             return View();36         }37     }
View Code

 

web.config

启用输出错误信息,否则iss在外网请求的时候不会看到自定义的输出的错误信息

 

目前有几个疑惑,没有深究:还望有网友知道能解惑一二,就不用去google 扒源码了。

1.如果不加这行代码,默认输出的是:text/html; 浏览器直接输出内容,不做解析.

httpContext.Response.ContentType = "text/html; charset=utf-8";

2.iis不会使用gzip压缩,不管输出的404错误页面有多大,都不会自动压缩.所以使用下面这种替换方式.

  [Compress]    public class SysController : Controller

猜测:

mvc 在action的Execute阶段后 还做了不少事情,比如上面提到的1,2点.正常200请求会执行默认的filter等阶段.

而当是404请求时,跳过了这些阶段.可能500请求也类似.

仅仅是猜测,还未验证,

 

更多:

转载地址:http://aaphl.baihongyu.com/

你可能感兴趣的文章
jquery ajax get post 的使用方法汇总
查看>>
50个必备的实用jQuery代码段
查看>>
网站安装打包 修改app.config[六]
查看>>
git 安装使用
查看>>
hive 分区表、桶表和外部表
查看>>
eclipse查看java方法域
查看>>
Linux系统究竟我要怎样学?
查看>>
正在学习linux的我写一封信给十年后的自己
查看>>
利用scp 远程上传下载文件/文件夹
查看>>
Windows下无窗口后台运行程序: ShellExecute
查看>>
读《美丽新世界》
查看>>
UIScrollView实现图片循环滚动
查看>>
我的友情链接
查看>>
王垠:怎样写一个解释器
查看>>
解决unicodedecodeerror ascii codec can’t decode byte 0xd7 in position 9 ordinal not in range(128)...
查看>>
Redis和Memcached的区别
查看>>
CSS选择器种类及介绍
查看>>
struts2 + form 表单上传文件
查看>>
Centos7下安装mongodb
查看>>
ES架构及原理
查看>>