2011-10-19 8 views
2

を活性化した後、私はこのように、私のウェブサイト上で圧縮を有効に:奇妙な効果が昨日圧縮

void context_BeginRequest(object sender, EventArgs e) 
{ 

    HttpApplication app = (HttpApplication)sender; 
    string encodings = app.Request.Headers.Get("Accept-Encoding"); 

    if (encodings == null) 
     return; 

    string url = app.Request.RawUrl.ToLower();   


    if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css") || url.Contains("ajax.ashx")) 
    { 

     Stream baseStream = app.Response.Filter; 
     encodings = encodings.ToLower(); 

     if (encodings.Contains("gzip")) 
     { 
      app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "gzip"); 
     } 
     else if (encodings.Contains("deflate")) 
     { 
      app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "deflate"); 
     } 
    } 
} 

昨夜、人々が破壊されるウェブサイトのスタイル不満ました。 FirefoxとChromeでサイトを試してみましたが、キャッシュをクリアしてから強制的にリフレッシュするまで同じ問題が発生しました。

今朝、私はSafariを開いて、そのブラウザでどのように見えるかを確認し、格納されているスタイルシートを確認しました。ここではトップラインのセクションです:

���`I�%&/m�{J�J��t��`$ؐ@�������iG#)�*��eVe][email protected]�흼��{����{����;�N'���?\fdl��J�ɞ!���?~|?"�~+M�m�?��{�7y����l]�餮���N���̛�x�Ϋ�Q�cMVg�� 

私はどちらかのSafariで始まるように圧縮されなかったものを解凍しようとしたか、あるいはそれが圧縮されたファイルを受け取って、それを復号していないと思います。

私のサイトの訪問者がキャッシュをクリアするとすぐにクリアされるか、HttpCompression関数を記述するのに間違いがありますか?

+0

あなただけさせてはいけない理由がある[IISはこれを行う](http://support.microsoft.com/kb/322603)あなたのために? –

+0

@ Mr.Disappointment私の前にサイトを開発していた人は、このようにしていました(彼はajax.ashxへの応答でのみ圧縮を有効にしていました)。それはうまくいくようです。 – Oliver

答えて

0

私はここに私の問題は、私の回答に追加されているVary:Accept-Encodingヘッダの私の不足に関連していたと信じています。 this related question on the subjectをご覧ください。私のコードは次のようになります。

if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css") || url.Contains("ajax.ashx")) 
{ 
    app.Response.AppendHeader("Vary", "Accept-Encoding"); 

    encodings = encodings.ToLower(); 

    if (encodings.Contains("gzip") || encodings == "*") 
    { 
     app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress); 
     app.Response.AppendHeader("Content-Encoding", "gzip"); 

    } 
    else if (encodings.Contains("deflate")) 
    { 
     app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress); 
     app.Response.AppendHeader("Content-Encoding", "deflate"); 
    } 
} 
1

は、代わりにこれを試してみてください。

HttpApplication app = sender as HttpApplication; 
     string acceptEncoding = app.Request.Headers["Accept-Encoding"]; 
     Stream prevUncompressedStream = app.Response.Filter; 

     if (!(app.Context.CurrentHandler is Page || 
      app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") || 
      app.Request["HTTP_X_MICROSOFTAJAX"] != null) 
      return; 

     if (string.IsNullOrEmpty(acceptEncoding)) 
      return; 

     acceptEncoding = acceptEncoding.ToLower(); 


     if (acceptEncoding.Contains("gzip") || acceptEncoding == "*") 
     { 
      // gzip 
      app.Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "gzip"); 
     } 
     else if (acceptEncoding.Contains("deflate")) 
     { 
      // defalte 
      app.Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "deflate"); 
     } 
+0

ありがとうございます。 'if(!app.Context.CurrentHandlerはPage || .....'ステートメントがどういうことを確認するのですか?画像のように圧縮するのが賢明でないものを圧縮するのは慎重です。 'userImage.ashx'ファイルからいくつかの動的PNGを提供します。 – Oliver