在PreRequestHandlerExecute 事件里边用DeflateStream修饰的Response.Filter替代Response.Filter
  public sealed class CompressionModule : IHttpModule
  {

    #region IHttpModule Members

    /// <summary>
    /// Disposes of the resources (other than memory) used by the module
    /// that implements <see cref="T:System.Web.IHttpModule"></see>.
    /// </summary>
    void IHttpModule.Dispose()
    {
      // Nothing to dispose;
    }

    /// <summary>
    /// Initializes a module and prepares it to handle requests.
    /// </summary>
    /// <param name="context">An <see cref="T:System.Web.HttpApplication"></see>
    /// that provides access to the methods, properties, and events common to
    /// all application objects within an ASP.NET application.
    /// </param>
    void IHttpModule.Init(HttpApplication context)
    {
      if (BlogSettings.Instance.EnableHttpCompression)
      {
        context.PreRequestHandlerExecute += new EventHandler(context_PostReleaseRequestState);
      }
    }

    #endregion

    private const string GZIP = "gzip";
    private const string DEFLATE = "deflate";

    #region Compress page

    /// <summary>
    /// Handles the BeginRequest event of the context control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    void context_PostReleaseRequestState(object sender, EventArgs e)
    {
      HttpApplication app = (HttpApplication)sender;
      if (app.Context.CurrentHandler is System.Web.UI.Page && app.Request["HTTP_X_MICROSOFTAJAX"] == null)
      {
        if (IsEncodingAccepted(DEFLATE))
        {
          app.Response.Filter = new DeflateStream(app.Response.Filter, CompressionMode.Compress);
          SetEncoding(DEFLATE);
        }
        else if (IsEncodingAccepted(GZIP))
        {
          app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);
          SetEncoding(GZIP);
        }
      }
            else if (app.Context.Request.Path.Contains("WebResource.axd"))
            {
                app.Context.Response.Cache.SetExpires(DateTime.Now.AddDays(30));
            }
    }

    /// <summary>
    /// Checks the request headers to see if the specified
    /// encoding is accepted by the client.
    /// </summary>
    private static bool IsEncodingAccepted(string encoding)
    {
      HttpContext context = HttpContext.Current;
      return context.Request.Headers["Accept-encoding"] != null && context.Request.Headers["Accept-encoding"].Contains(encoding);
    }   

    /// <summary>
    /// Adds the specified encoding to the response headers.
    /// </summary>
    /// <param name="encoding"></param>
    private static void SetEncoding(string encoding)
    {
      HttpContext.Current.Response.AppendHeader("Content-encoding", encoding);
    }

    #endregion

  }

二:
HttpCompress是在.NET内部通过httpModules模型来实现自定义的压缩模块。

1. 配置
<httpModules>
      <add name="CompressionModule" type="blowery.Web.HttpCompress.HttpModule, blowery.web.HttpCompress"/>
</httpModules> 

2.注册事件钩子
context.ReleaseRequestState += new EventHandler(this.CompressContent);
context.PreSendRequestHeaders += new EventHandler(this.CompressContent);
IHttpModule事件

3.在代码发送前压缩

}

4.压缩类实现

HttpOutputFilter ,不支持Read, Seek,GetLength等操作,与之相关控制属性返回false, 具体方法或属性则抛异常new NotSupportedException(); 

【转】HttpCompressusing System;
【转】HttpCompress
using System.IO;
【转】HttpCompress

CompressingFilter 增加了压缩相关的属性和方法,如,写头

【转】HttpCompressusing System;
【转】HttpCompress
using System.IO;
【转】HttpCompress
using System.Web;
【转】HttpCompress

执行类,利用压缩类实现了Write,Close,Flush

【转】HttpCompressusing System;
【转】HttpCompress
using System.IO;
【转】HttpCompress
【转】HttpCompress
using System.IO.Compression;
【转】HttpCompress

相关文章:

  • 2021-10-14
  • 2021-07-27
  • 2022-01-25
  • 2021-06-18
  • 2021-07-25
  • 2022-12-23
  • 2021-11-25
  • 2022-12-23
猜你喜欢
  • 2021-08-10
  • 2021-09-14
  • 2022-02-11
  • 2021-11-18
  • 2021-11-05
  • 2021-10-06
  • 2021-11-17
相关资源
相似解决方案