【代码片段】HTTP压缩gzip、deflate

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using ADODB;
using System.IO.Compression;
using System.IO;

namespace QuickEAS.WinUI.WebControl
{
    public class LibHTTPCompressionModule : IHttpModule
    {
        void IHttpModule.Dispose() { }

        void IHttpModule.Init(HttpApplication context)
        {
            context.PreRequestHandlerExecute += new EventHandler(context_PostReleaseRequestState);
        }

        void context_PostReleaseRequestState(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;
            //这里做一个过滤,后台不需要压缩,具体可以自己写一些判断,
            //我这里只是当访问路径有 /area开头时不允许压缩,因为后台有时候是动态输出,用了压缩就没有意义了
            if (app.Request.Path.StartsWith("/area/", StringComparison.OrdinalIgnoreCase))
                return;
            //当前为aspx页面,并且不是WEBFORM回调时,就开启压缩
            //if (app.Context.CurrentHandler is System.Web.UI.Page && app.Request["HTTP_X_MICROSOFTAJAX"] == null)
            if (app.Request["HTTP_X_MICROSOFTAJAX"] == null)
            {
                if (IsEncodingAccepted(GZIP))
                {//优先使用GZIP压缩
                    app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);
                    SetEncoding(GZIP);
                }
                else if (IsEncodingAccepted(DEFLATE))
                {//Deflate也可以
                    app.Response.Filter = new DeflateStream(app.Response.Filter, CompressionMode.Compress);
                    SetEncoding(DEFLATE);
                }
            }
        }

        private static readonly string GZIP = "gzip";
        private static readonly string DEFLATE = "deflate";
        //判断客户端是否支持指定的压缩
        private static bool IsEncodingAccepted(string encoding)
        {
            HttpContext context = HttpContext.Current;
            return context.Request.Headers["Accept-Encoding"] != null && context.Request.Headers["Accept-encoding"].Contains(encoding);
        }
        //开启了压缩后,需要设置一下返回的编码类型,方便客户端解压缩
        private static void SetEncoding(string encoding)
        {
            HttpContext.Current.Response.AppendHeader("Content-Encoding", encoding);
        }
    }

}

猜你喜欢

转载自blog.csdn.net/michelsn/article/details/80304734