WebApi Gzip(Deflate) 壓縮請求數據

因爲不能直接訪問指定數據庫,只能經過跳板機查詢Oracle數據,因此要作一個數據中轉接口,算法

查詢數據就要壓縮,因而就找資料,代碼以下,其中要注意的是Response.Headers.Remove("Content-Encoding"); 數據庫

這段,對Response.Headrs的操做若是IIS6是不支持的,json

會出現以下錯誤:app

接口出現錯誤:"此操做要求使用 IIS 集成管線模式。" ()
System.PlatformNotSupportedException: 此操做要求使用 IIS 集成管線模式ide

 

其實在OnActionExecuting 這個方法中,請求中Content-Encoding原本就是空的,能夠沒必要操做,this

在項目中添加下面的類;spa

而後在Contoller方法上加上對應數據,便可實現對數據的壓縮。code

 

// <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);
        //}
    }

 

使用方法orm

        [DeflateCompression]
        public string GetDeflate()
        {
            return "valuevaluevaluevaluevaluevaluevaluevaluevaluevalueSDFASDFASDFASDFASDFWERFWEFCASDFSDAFASDFASDFASDFSADFSA";
        }

        [CompressContent]
        public string GetGZip()
        {
            return "valuevaluevaluevaluevaluevaluevaluevaluevaluevalueSDFASDFASDFASDFASDFWERFWEFCASDFSDAFASDFASDFASDFSADFSA";
        }

        [GZipCompression]
        public string GetRaw()
        {
            return "valuevaluevaluevaluevaluevaluevaluevaluevaluevalueSDFASDFASDFASDFASDFWERFWEFCASDFSDAFASDFASDFASDFSADFSA";
        }
相關文章
相關標籤/搜索