2012-02-03 15 views
3

私のウェブアプリはその場でCSVファイルを生成しますが、私はGZIP圧縮を使用するとき、ダウンロードに失敗したGZIP圧縮を使用して、ダウンロードファイル:「コンテンツのデコードに失敗しました」というエラーとき

HTTP/1.1 200 OK 
Cache-Control: private, s-maxage=0,no-store, no-cache 
Transfer-Encoding: chunked 
Content-Type: text/csv;charset=utf-8 
Content-Encoding: gzip 
Vary: Accept-Encoding 
Server: Microsoft-IIS/7.5 
X-AspNetMvc-Version: 3.0 
Content-Disposition: attachment;filename="filename.csv" 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
p3p: CP="CAO PSA OUR" 
Date: Fri, 03 Feb 2012 11:27:27 GMT 

ダウンロードが」と表示されますGoogle ChromeやInternet Explorerで「中断されました」というエラーメッセージが表示され、「コンテンツのデコードに失敗しました」と表示されます。

HTTP/1.1 200 OK 
Cache-Control: private, s-maxage=0,no-store, no-cache 
Transfer-Encoding: chunked 
Content-Type: text/csv;charset=utf-8 
Server: Microsoft-IIS/7.5 
X-AspNetMvc-Version: 3.0 
Content-Disposition: attachment;filename="filename.csv" 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
p3p: CP="CAO PSA OUR" 
Date: Fri, 03 Feb 2012 11:23:30 GMT 

解決方法は、その操作で圧縮を無効にしていますが、なぜこれが起こりますか?

乾杯。

UPDATE:私が使用圧縮フィルタ:

public class EnableCompressionAttribute : ActionFilterAttribute 
{ 
    const CompressionMode compress = CompressionMode.Compress; 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.IsChildAction) 
      return; 

     var actionAttributes = filterContext.ActionDescriptor.GetCustomAttributes(true); 
     if (actionAttributes != null && actionAttributes.Any(attr => attr is SkipCompressionAttribute)) 
      return; 

     HttpRequestBase request = filterContext.HttpContext.Request; 
     HttpResponseBase response = filterContext.HttpContext.Response; 
     String acceptEncoding = request.Headers["Accept-Encoding"]; 

     if (acceptEncoding == null || response.Filter == null) 
      return; 

     if (acceptEncoding.ToLower().Contains("gzip")) 
     { 
      response.Filter = new GZipStream(response.Filter, compress); 
      response.AppendHeader("Content-Encoding", "gzip"); 
      response.AppendHeader("Vary", "Accept-Encoding"); 
     } 
     else if (acceptEncoding.ToLower().Contains("deflate")) 
     { 
      response.Filter = new DeflateStream(response.Filter, compress); 
      response.AppendHeader("Content-Encoding", "deflate"); 
      response.AppendHeader("Vary", "Accept-Encoding"); 
     } 
    } 
} 
+2

あなたは、コンテンツの圧縮を適用するにはどうすればよいですか? – Gumbo

+0

投稿を更新しました。 – vtortola

+0

これらの圧縮フィルタは、HTTPで期待どおりのデータを返すのですか? – Gumbo

答えて

1

を試してください:クライアントが圧縮されたコンテンツを受け入れる場合、何が、次のクライアント:

Response.Headers.Remove("Content-Encoding"); 
Response.AppendHeader("Content-Encoding", "gzip"); 

もう一つの問題は、キャッシングかもしれそうではなく、サーバーは圧縮データをキャッシュしましたか?二番目のクライアントは何を得ますか?デコードしないキャッシュされた圧縮ページ!これを修正するには

、別の方法を追加:

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom == "GZIP") 
    { 
     string acceptEncoding = HttpContext.Current.Response.Headers["Content-Encoding"]; 

     if (string.IsNullOrEmpty(acceptEncoding)) 
      return ""; 
     else if (acceptEncoding.Contains("gzip")) 
      return "GZIP"; 
     else if (acceptEncoding.Contains("deflate")) 
      return "DEFLATE"; 

     return ""; 
    } 

    return base.GetVaryByCustomString(context, custom); 
} 
+0

uhh ...私はContent-Encodingヘッダーが見つからなかったことに気付かなかった...明日の朝にそれを強制しようとします。ありがとう! – vtortola

関連する問題