zoukankan      html  css  js  c++  java
  • WebApi Gzip(Deflate) 压缩请求数据

    由于不能直接访问指定数据库,只能通过跳板机查询Oracle数据,所以要做一个数据中转接口,

    查询数据就要压缩,于是就找资料,代码如下,其中要注意的是Response.Headers.Remove("Content-Encoding");

    这段,对Response.Headrs的操作如果IIS6是不支持的,

    会出现如下错误:

    接口出现错误:"此操作要求使用 IIS 集成管线模式。" ()
    System.PlatformNotSupportedException: 此操作要求使用 IIS 集成管线模式

    其实在OnActionExecuting 这个方法中,请求中Content-Encoding本来就是空的,可以不必操作,

    在项目中添加下面的类;

    然后在Contoller方法上加上对应数据,即可实现对数据的压缩。

    // <summary>
        /// 自动识别客户端是否支持压缩,如果支持则返回压缩后的数据
        /// Attribute that can be added to controller methods to force content
        /// to be GZip encoded if the client supports it
        /// </summary>
        public class CompressContentAttribute : ActionFilterAttribute
        {
            /// <summary>
            /// Override to compress the content that is generated by
            /// an action method.
            /// </summary>
            /// <param name="filterContext"></param>
            public override void OnActionExecuting(HttpActionContext filterContext)
            {
                GZipEncodePage();
            }
    
            /// <summary>
            /// Determines if GZip is supported
            /// </summary>
            /// <returns></returns>
            public static bool IsGZipSupported()
            {
                string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
                if (!string.IsNullOrEmpty(AcceptEncoding) &&
                        (AcceptEncoding.Contains("gzip") || AcceptEncoding.Contains("deflate")))
                    return true;
                return false;
            }
    
            /// <summary>
            /// Sets up the current page or handler to use GZip through a Response.Filter
            /// IMPORTANT:
            /// You have to call this method before any output is generated!
            /// </summary>
            public static void GZipEncodePage()
            {
                HttpResponse Response = HttpContext.Current.Response;
    
                if (IsGZipSupported())
                {
                    string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
    
                    if (AcceptEncoding.Contains("deflate"))
                    {
                        Response.Filter = new System.IO.Compression.DeflateStream(Response.Filter,
                                                   System.IO.Compression.CompressionMode.Compress);
                        #region II6不支持此方法,(实际上此值默认为null 也不需要移除)
                        //Response.Headers.Remove("Content-Encoding");
                        #endregion
                        Response.AppendHeader("Content-Encoding", "deflate");
                    }
                    else
                    {
                        Response.Filter = new System.IO.Compression.GZipStream(Response.Filter,
                                                     System.IO.Compression.CompressionMode.Compress);
                        #region II6不支持此方法,(实际上此值默认为null 也不需要移除)
                        //Response.Headers.Remove("Content-Encoding");
                        #endregion
                        Response.AppendHeader("Content-Encoding", "gzip");
                    }
                }
    
                // Allow proxy servers to cache encoded and unencoded versions separately
                Response.AppendHeader("Vary", "Content-Encoding");
            }
        }
    
        /// <summary>
        /// 强制Defalte压缩
        /// Content-encoding:gzip,Content-Type:application/json
        /// DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩,有众多开源的实现算法。
        /// </summary>
        public class DeflateCompressionAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(HttpActionContext filterContext)
            {
                HttpResponse Response = HttpContext.Current.Response;
                Response.Filter = new System.IO.Compression.DeflateStream(Response.Filter,
                                                  System.IO.Compression.CompressionMode.Compress);
                #region II6不支持此方法,(实际上此值默认为null 也不需要移除)
                //Response.Headers.Remove("Content-Encoding");
                #endregion
                Response.AppendHeader("Content-Encoding", "deflate");
            }
    
            //public override void OnActionExecuted(HttpActionExecutedContext actContext)
            //{
            //    var content = actContext.Response.Content;
            //    var bytes = content == null ? null : content.ReadAsByteArrayAsync().Result;
            //    var zlibbedContent = bytes == null ? new byte[0] :
            //    APP.Core.Utility.ZHelper.DeflateByte(bytes);
            //    actContext.Response.Content = new ByteArrayContent(zlibbedContent);
            //    actContext.Response.Content.Headers.Remove("Content-Type");
            //    actContext.Response.Content.Headers.Add("Content-encoding", "deflate");
            //    actContext.Response.Content.Headers.Add("Content-Type", "application/json");
            //    base.OnActionExecuted(actContext);
            //}
        }
    
        /// <summary>
        /// 强制GZip压缩,application/json
        /// Content-encoding:gzip,Content-Type:application/json
        /// GZIP是使用DEFLATE进行压缩数据的另一个压缩库
        /// </summary>
        public class GZipCompressionAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(HttpActionContext filterContext)
            {
                HttpResponse Response = HttpContext.Current.Response;
                Response.Filter = new System.IO.Compression.GZipStream(Response.Filter,
                                                  System.IO.Compression.CompressionMode.Compress);
                #region II6不支持此方法,(实际上此值默认为null 也不需要移除)
                //Response.Headers.Remove("Content-Encoding");
                #endregion
                Response.AppendHeader("Content-Encoding", "gzip");
            }
    
            //public override void OnActionExecuted(HttpActionExecutedContext actContext)
            //{
            //    var content = actContext.Response.Content;
            //    var bytes = content == null ? null : content.ReadAsByteArrayAsync().Result;
            //    var zlibbedContent = bytes == null ? new byte[0] :
            //    APP.Core.Utility.ZHelper.GZipByte(bytes);
            //    actContext.Response.Content = new ByteArrayContent(zlibbedContent);
            //    actContext.Response.Content.Headers.Remove("Content-Type");
            //    actContext.Response.Content.Headers.Add("Content-encoding", "gzip");
            //    actContext.Response.Content.Headers.Add("Content-Type", "application/json");
            //    base.OnActionExecuted(actContext);
            //}
        }

    使用方法

            [DeflateCompression]
            public string GetDeflate()
            {
                return "valuevaluevaluevaluevaluevaluevaluevaluevaluevalueSDFASDFASDFASDFASDFWERFWEFCASDFSDAFASDFASDFASDFSADFSA";
            }
    
            [CompressContent]
            public string GetGZip()
            {
                return "valuevaluevaluevaluevaluevaluevaluevaluevaluevalueSDFASDFASDFASDFASDFWERFWEFCASDFSDAFASDFASDFASDFSADFSA";
            }
    
            [GZipCompression]
            public string GetRaw()
            {
                return "valuevaluevaluevaluevaluevaluevaluevaluevaluevalueSDFASDFASDFASDFASDFWERFWEFCASDFSDAFASDFASDFASDFSADFSA";
            }
  • 相关阅读:
    C++ 单例模式
    单链表快速排序
    美团后台面经
    排序算法及其优化总结
    (转)再谈互斥量与环境变量
    互斥锁和自旋锁
    算法题总结----数组(二分查找)
    Linux里的2>&1的理解
    Ubuntu下开启mysql远程访问
    说说eclipse调优,缩短启动时间
  • 原文地址:https://www.cnblogs.com/miralce/p/4981570.html
Copyright © 2011-2022 走看看