zoukankan      html  css  js  c++  java
  • MVC全局GZIP压缩,异常黄页出现乱码解决方案

    最近这个问题一直让我很纠结,设置了MVC全局压缩后发现,连抛出异常的页面也会进行压缩,于是出现一连串压缩后的乱码,感觉实在是太坑爹了。其中一直在想既然能压缩,那就肯定可以解压缩,于是一直试啊试,还是没成功,试过读取写入流,解压缩,试过用系统的方法,可是都没用,唉,那时候感觉真的一团糟啊,在国外的一些技术交流社区也提过问,可是都没得到理想的答案,经过这几天的努力,不过最主要的还是我们项目经理—小亮的指导,我完成了这么一个让我很纠结的压缩的问题。好了,不多说了,开始上代码吧。

    首先来看看我定义的CompressFilterAttribute过滤器吧。

     1    /// <summary>
     2     /// 文件压缩特性
     3     /// </summary>
     4     public class CompressFilterAttribute : ActionFilterAttribute
     5     {
     6         private bool isEnableCompression = true;
     7 
     8         /// <summary>
     9         /// 构造函数
    10         /// </summary>
    11         public CompressFilterAttribute()
    12         {
    13         }
    14 
    15         #region OnActionExecuting
    16         /// <summary>
    17         /// Action方法执行前执行的方法
    18         /// </summary>
    19         /// <param name="filterContext">ActionExecutingContext 对象</param>
    20         public override void OnActionExecuting(ActionExecutingContext filterContext)
    21         {
    22             object[] actionFilter = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoCompress), false);
    23             object[] controllerFilter = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(NoCompress), false);
    24             if (controllerFilter.Length == 1 || actionFilter.Length == 1)
    25             {
    26                 isEnableCompression = false;
    27             }
    28         }
    29         #endregion
    30 
    31         #region OnResultExecuted
    32         /// <summary>
    33         /// 返回结果集之后执行的方法
    34         /// </summary>
    35         /// <param name="filterContext"></param>
    36         public override void OnResultExecuted(ResultExecutedContext filterContext)
    37         {
    38             if (filterContext.HttpContext.Request.IsAjaxRequest())
    39             {
    40                 return;
    41             }
    42 
    43             if (filterContext.Exception != null)
    44             {
    45                 return;
    46             }
    47 
    48             if (isEnableCompression)
    49             {
    50                 HttpRequestBase request = filterContext.HttpContext.Request;
    51                 HttpResponseBase response = filterContext.HttpContext.Response;
    52                 string acceptEncoding = request.Headers["Accept-Encoding"];
    53 
    54                 if (acceptEncoding == null)
    55                 {
    56                     return;
    57                 }
    58 
    59                 if (acceptEncoding.ToLower().Contains("gzip"))
    60                 {
    61                     response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
    62                     response.AppendHeader("Content-Encoding", "gzip");
    63                 }
    64                 else if (acceptEncoding.ToLower().Contains("deflate"))
    65                 {
    66                     response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
    67                     response.AppendHeader("Content-Encoding", "deflate");
    68                 }
    69             }
    70         #endregion
    71         }

    文中运用到的排除压缩方法是:http://www.cnblogs.com/yangda/archive/2013/03/20/2970860.html

    首先在OnActionExecuting方法呢是判断当前Controller或者Action方法是否贴有特性[NoCompress],当贴有我们就直接跳过,不对其进行压缩。

    OnResultExecuted便是真正的对代码进行压缩的语句了,判断当前是否为AJAX请求,判断当前是否出现错误,出现这些情况都排除,不对其进行压缩。

    开始想的太复杂了,后来仔细分析了一下,也就是在出现错误的时候我们不对其进行压缩,页面也就不会出现乱码了。

    重点代码是:filterContext.Exception != null  ,判断其之前是否出现过异常。出现后,不执行压缩,直接抛出错误页面。

  • 相关阅读:
    Kaldi的data目录解析
    Kaldi的nnet3
    Kaldi中的Chain模型
    Karel版本的nnet1
    Dan版本的nnet2
    MFCC/Filter Bank的提取流程
    【算法专题】工欲善其事必先利其器—— C++ STL中vector(向量/不定长数组)的常用方法总结
    App 设计技巧
    js判断是否在微信浏览器中打开
    WebApi 跨域
  • 原文地址:https://www.cnblogs.com/yangda/p/2980931.html
Copyright © 2011-2022 走看看