2014-01-09 45 views
0

我正在使用一個CompressionModule在web.config中使用,我已經打破了一個更大的問題到這種情況下,我難住。無法設置GzipStream和內容編碼gzip在相同的響應

在這個例子中,我創建了一個新的MVC4互聯網應用,並取得了以下修改web.config中:

<handlers> 
    <!-- 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    --> 
    <add name="Content" path="*" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" /> 
</handlers> 
<modules> 
     <remove name="monorailRouting" /> 
     <add name="compressionModule" type="Platform.Web.CompressionModule" /> 
    <!-- 
    <add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     --> 
</modules> 

其中壓縮模塊

namespace Platform.Web { 
public class CompressionModule : IHttpModule { 

    #region HTTP Header Constants 
    private const string DEFLATE = "deflate"; 
    private const string GZIP = "gzip"; 
    private const string CONTENT_ENCODING = "Content-Encoding"; 
    private const string ACCEPT_ENCODING = "Accept-Encoding"; 
    private const string VARY = "Vary"; 
    #endregion 

    #region IHttpModule Members 
    public void Dispose() { 
     //noop 
    } 

    public void Init(HttpApplication context) { 
     context.BeginRequest += new EventHandler(context_CompressResponse); 
    } 


    void context_CompressResponse(object sender, EventArgs e) { 
     HttpApplication app = (HttpApplication)sender; 

     string encodings = app.Request.Headers.Get(ACCEPT_ENCODING); 

     if (encodings == null) 
     { 
      return; 
     } 

     encodings = encodings.ToLower(); 

     if (encodings.Contains(GZIP)) 
     { 
      //1 
      app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress); 

      //2 
      app.Response.AppendHeader(CONTENT_ENCODING, GZIP); 

     } 

     app.Response.AppendHeader(VARY, CONTENT_ENCODING); 



    } 

    #endregion 
} 
} 

而且我遇到了以下問題:

  1. 如果第1行和第2行存在,則應用程序加載正常。但是沒有任何東西顯然是在頭文件中壓縮的,也不是正文。我通過Fiddler來確定這一點。

  2. 如果第1行存在,但2應用程序加載但不可讀的gzip爲 顯示在瀏覽器中。

  3. 如果第1行不存在,但2應用程序無法加載,但 內容編碼:gzip位於標題中。

任何人有什麼我可能做錯的建議嗎?

回答

0

兩件事情我認爲應該在這裏完成的,

  1. 響應濾波器應考慮到流
  2. 副本的由標題變化發生變更

嘗試以下代碼:

void context_CompressResponse(object sender, EventArgs e) 
{ 
    HttpApplication app = (HttpApplication)sender; 

    string encodings = app.Request.Headers.Get(ACCEPT_ENCODING); 
    if (encodings == null) 
    { 
     return; 
    } 

    encodings = encodings.ToLower(); 

    if (encodings.Contains(GZIP)) 
    { 
     Stream baseStream = app.Response.Filter; 

     //1 
     app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress); 

     //2 
     app.Response.AppendHeader(CONTENT_ENCODING, GZIP); 
    } 
    Response.Cache.VaryByHeaders[ACCEPT_ENCODING] = true; 
} 

另外,如需進一步討論,請查看此S O article

+0

不行。我只是得到一個類似於我的第一種情況的未壓縮的響應。 –

0

原來Fiddler2沒有正確讀取標題。

如果我在Chrome中查看響應,可以看到Content-Encoding正在設置爲gzip。

-Geoff

相關問題