2010-12-21 23 views
0

我在這方面花了不少時間,但似乎無處可去。我有一個很大的頁面,我真的想加快速度。顯而易見的地方似乎是HTTP壓縮,但我似乎無法讓它爲我工作。有沒有人有HTTP壓縮使用ASP.NET?

經過大量搜索後,我嘗試了下面代碼的幾種變體。它有點作品,但刷新瀏覽器後,結果似乎崩潰了。當頁面使用緩存時,他們轉向垃圾。如果我關閉緩存,那麼頁面看起來是正確的,但我失去了我的CSS格式(存儲在一個單獨的文件),並得到一個錯誤,包含的JS文件包含無效字符。

我在網上找到的大部分資源要麼很舊,要麼專注於直接訪問IIS。我的頁面正在共享主機帳戶上運行,並且我無法直接訪問正在運行的IIS7。

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    // Implement HTTP compression 
    if (Request["HTTP_X_MICROSOFTAJAX"] == null) // Avoid compressing AJAX calls 
    { 
     // Retrieve accepted encodings 
     string encodings = Request.Headers.Get("Accept-Encoding"); 
     if (encodings != null) 
     { 
      // Verify support for or gzip (deflate takes preference) 
      encodings = encodings.ToLower(); 
      if (encodings.Contains("gzip") || encodings == "*") 
      { 
       Response.Filter = new GZipStream(Response.Filter, 
        CompressionMode.Compress); 
       Response.AppendHeader("Content-Encoding", "gzip"); 
       Response.Cache.VaryByHeaders["Accept-encoding"] = true; 
      } 
      else if (encodings.Contains("deflate")) 
      { 
       Response.Filter = new DeflateStream(Response.Filter, 
        CompressionMode.Compress); 
       Response.AppendHeader("Content-Encoding", "deflate"); 
       Response.Cache.VaryByHeaders["Accept-encoding"] = true; 
      } 
     } 
    } 
} 

有沒有人有這個更好的成功?

回答

1

我已經使用GZipStreamDeflateStream直接編寫輸出,雖然我不熟悉Response.Filter屬性,但我已經有了很好的結果。給這個旋轉:

string response = "your output body"; 
string accept = Request.Headers["Accept-Encoding"]; 
if(accept == null) accept = ""; 
if (response.Length < 100 || !(accept.Contains("deflate") || accept.Contains("gzip"))) 
    Response.Write(response); 
else 
{ 
    byte[] compressed; 
    bool useDeflate = accept.Contains("deflate"); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     using (Stream deflate = useDeflate 
      ? (Stream)new DeflateStream(stream, CompressionMode.Compress, true) 
      : (Stream)new GZipStream(stream, CompressionMode.Compress, true)) 
     using (StreamWriter writer = new StreamWriter(deflate)) 
      writer.Write(response); 
     compressed = new byte[stream.Length]; 
     stream.Position = 0; 
     stream.Read(compressed, 0, compressed.Length); 
    } 
    Response.Headers["Content-Encoding"] = useDeflate ? "deflate" : "gzip"; 
    Response.BinaryWrite(compressed); 
} 
+0

這是否也在Application_BeginRequest()? – 2010-12-21 06:51:32

+0

可悲的是,我只在一個ASP.Net項目上工作過,而且這是.ashx IHttpHandler的一個東西,如果你願意,它可以讓整個響應主體成爲一個字符串。我不知道它是如何在普通的.aspx頁面中完成的。我工作過的所有其他C#都是Win32的東西。如果ASP.Net具有某種輸出緩衝機制,那麼這個代碼會在它被刷新之前對待它......無論它在哪裏。對不起,我不能更具體! – 2010-12-22 11:50:46

相關問題