2009-11-03 33 views
11

當我使用壓縮過濾器並收到錯誤時,錯誤頁面只是亂碼字符。問題似乎是,當IIS轉移到錯誤頁面時,壓縮過濾器仍然有效,但標頭被清除。如果沒有「Content-encoding:gzip」頭文件,瀏覽器會顯示原始的壓縮二進制數據。使用壓縮ActionFilter時,服務器錯誤消息會清除內容編碼標題並呈現爲亂碼

我使用的是IIS7.5,ASP.NET MVC 2預覽2,看起來像這樣一個ActionFilter:

public class CompressResponseAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.HttpContext.Request; 
     var response = filterContext.HttpContext.Response; 

     var acceptEncoding = request.Headers["Accept-Encoding"]; 

     if (string.IsNullOrEmpty(acceptEncoding)) 
      return; 

     acceptEncoding = acceptEncoding.ToLowerInvariant(); 

     if (acceptEncoding.Contains("gzip")) 
     { 
      response.AppendHeader("Content-encoding", "gzip"); 
      response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); 
     } 
     else if (acceptEncoding.Contains("deflate")) 
     { 
      response.AppendHeader("Content-encoding", "deflate"); 
      response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); 
     } 
    } 
} 

任何人都經歷過這樣?

回答

11

更新: 我偶然發現了Rick Strahl的博客文章以及其他壓縮問題。在這裏看到: http://www.west-wind.com/weblog/posts/2011/May/02/ASPNET-GZip-Encoding-Caveats

他的解決方案,這似乎更可靠,是擺在Global.asax.cs中的以下內容:

protected void Application_Error(object sender, EventArgs e) 
{ 
    // Remove any special filtering especially GZip filtering 
    Response.Filter = null; 
} 

原來的答覆: 我通過在應用壓縮固定這OnResultExecuting而不是OnActionExecuting。

+0

不妨將這個標記爲你的答案,因爲它的工作原理...... :) – 2012-03-07 06:39:03

+0

這讓我感到沮喪幾個月,但我讓ELMAH看到真正的錯誤而不是亂碼,很高興最終得到修復: ) – 2013-03-12 20:13:31

相關問題