次のように、出力圧縮を手動で有効にするカスタムHttpHandlerがあります。
context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
これはほとんどのリクエストでうまく機能しますが、例外が発生すると、「Content-encoding」ヘッダーが応答から消え、圧縮フィルターはそのまま残ります。その結果、エラーページはgzipで圧縮されますが、ブラウザはその事実を示すヘッダーを受け取りません。次に、ブラウザはまだ圧縮されているデータをテキストとして表示しようとします。これはgobbledygookです。
完全なテストケースコードを以下に示します。代わりに、圧縮を無効にするか、例外をスローしないようにしてください。
「Content-encoding」ヘッダーが消える理由を誰かが明らかにすることはできますか?
ハンドラーが最後に行うように単純に圧縮を有効にできると思います。そのため、例外が発生した場合、圧縮フィルターが追加されるポイントに到達することはありません。しかし、私が見ている振る舞いはバグとして私を襲います。誰でも確認できますか?
public class TestHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
CompressResponse(context);
context.Response.Write("Hello world");
// Throw an exception for testing purposes
throw new Exception("Just testing...");
}
private void CompressResponse(HttpContext context)
{
string acceptEncoding = context.Request.Headers["Accept-Encoding"];
if (String.IsNullOrEmpty(acceptEncoding))
{
return;
}
// gzip or wildcard
if (acceptEncoding.ToLower().Contains("gzip") || acceptEncoding.Contains("*"))
{
context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
return;
}
// Also handles deflate (not shown here)
// <snip>
}
public bool IsReusable
{
get { return true; }
}
}
編集:テストケースで見たまだエンコードされた応答のスクリーンショット:http://i.imgur.com/49Vcl.png