zoukankan      html  css  js  c++  java
  • 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         }
    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 : 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     }
    View Code

    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请求也类似.

    仅仅是猜测,还未验证,

  • 相关阅读:
    SAP MM 采购附加费计入物料成本之二
    SAP MM 采购附加费计入物料成本?
    SAP MM 作为采购附加费的运费为啥没能在收货的时候计入物料成本?
    SAP MM 外部采购流程里的Advanced Return Management
    SAP MM 外部采购流程里的如同鸡肋一样的Advanced Returns Management功能
    SAP MM Why is the freight not included in the material cost at the time of GR?
    SAP MM: Change of material moving average price after goods receipt and invoice verification posting for PO
    SAP 创建启用了ARM功能的采购订单,报错 Shipping processing is not selected to supplier 100057 in purchase org. 0002
    GIT·代码仓库默认分支更改
    .Net/C#·运行报错缺少XXX文件,但双击无法跳转缺少位置
  • 原文地址:https://www.cnblogs.com/calvinK/p/3856123.html
Copyright © 2011-2022 走看看