专栏首页calvinasp.net mvc输出自定义404等错误页面,非302跳转。

asp.net mvc输出自定义404等错误页面,非302跳转。

朋友问到一个问题,如何输出自定义错误页面,不使用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             }
28         }
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 : Controller
25     {
26         //
27         // GET: /sys/
28 
29         public ActionResult NotFound()
30         {
31             return View();
32         }
33         public ActionResult Error()
34         {
35             return View();
36         }
37     }

web.config

<system.webServer>
    <httpErrors errorMode="Detailed" />

目前有几个疑惑,没有深究:还望有网友知道能解惑一二,就不用去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请求也类似.

仅仅是猜测,还未验证,

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .net core 源码解析-mvc route的注册,激活,调用流程(三)

    mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所指定的controller和action激活controller并调...

    旺财的城堡
  • .Net Core Logger 实现log写入本地文件系统

    .net core 自带一个基础的logger框架Microsoft.Extensions.Logging。

    旺财的城堡
  • asp.net mvc HandleErrorAttribute 异常错误处理 无效!

    现象:filters.Add(new HandleErrorAttribute()); 使用了全局的异常处理过滤。

    旺财的城堡
  • 为什么文件名必须和public修饰的类名称必须一致

    因为: Java是被解释执行的。它在运行时并不是将所有的class文件全都放到内存中。而是在遇到import的时候才去相应的文件目录找相应的class文件。...

    秋白
  • 设计模式(五)——装饰器

    在装饰模式中, 必然有一个最基本、 最核心、 最原始的接口或抽象类充当 Component抽象构件。

    小森啦啦啦
  • Ajax下载文件(页面无刷新)

    说明:Ajax是无法实现文件传输的,本文只是模拟了Ajax不刷新页面就可以请求并返回数据的效果。实质上还是通过提交form表单来返回文件流的输出。

    用户1518699
  • [ASP.NET Core 3框架揭秘] 配置[7]:多样化的配置源[中篇]

    物理文件是我们最常用到的原始配置载体,而最佳的配置文件格式主要有三种,它们分别是JSON、XML和INI,对应的配置源类型分别是JsonConfiguratio...

    蒋金楠
  • thrift:swift项目笔记

    先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目。 facebook的thrift IDL文件,如果默认用t...

    菩提树下的杨过
  • vue学习笔记9-监听属性-watch

    这样就可以实现绑定 而且他后面也有很多功能,比如.lazy,惰性更新,只有焦点离开才会更新

    雪地二货
  • Java 8 - Lambda

    Lambda表达式是一段可以传递的代码。 将面向对象中传递数据编程传递行为。 如果原来是这样编写一个线程:

    悠扬前奏

扫码关注云+社区

领取腾讯云代金券