2012-02-03 3 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 크롬 및 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

어 ... 나는 Content-Encoding 헤더가 누락되었음을 알지 못했습니다 ... 내일 아침에 강제로 시도 할 것입니다. 감사! – vtortola

관련 문제