2013-01-02 4 views
1

URL에서 일련의 문자열을 가져 와서 해당 문자열과 관련된 일부 pdfs를 찾아서 DotNetZip을 사용하여 압축 한 다음 사용자에게 반환하는 웹 페이지가 있습니다.손상된 zip 파일 생성을 디버깅하는 방법?

protected void Page_Load(object sender, EventArgs e) 
{ 
    string[] fileNames = Request.QueryString["requests"].Split(','); 
    Response.Clear(); 
    Response.ClearHeaders(); 
    Response.ContentType = "application/zip"; 
    string archiveName = String.Format("MsdsRequest-{0}.zip", DateTime.Now.ToString("yyyy-mm-dd-HHmmss")); 
    Response.AddHeader("Content-Disposition", "attachment; filename=\"" + archiveName + "\""); 

    using (ZipFile zip = new ZipFile()) 
    { 
     foreach (string fileName in fileNames) 
     { 
      zip.AddFile(String.Format(SiteSettings.PdfPath + "{0}.pdf", msdsFileName), ""); 
     } 
     zip.Save(Response.OutputStream); 
    } 
    Response.Flush(); 
} 

(당신이하기 전에 누군가가이 URL에 다른 값을 넣으면는 이러한 보안 파일이 아닌 ... 괜찮을 것입니다.)

: 여기를 Page_Load이다 -이 작업을 수행하는 페이지는 매우 간단합니다

내 개발 상자에서 제대로 작동합니다. 그러나 QA 시스템에서 테스트 할 때 zip 파일을 다운로드하지만 손상되었습니다. 오류가 발생하지 않고 이벤트 로그에 아무 것도 기록되지 않습니다.

QA 환경에서 대화식으로 디버깅 할 수있는 방법을 찾는 것이 가능하지만 실제로 dll을 찾을 수없는 등의 오류가 발생하여 실제로 아무 것도 실패하지 않고 성공적으로 디버깅 할 수 있습니다. 비어 있지 않은 (그러나 손상된) zip 파일을 생성하면서, 나는 그것을 통해 단계별로 많은 것을 발견하지 않을 것이라고 생각하고있다.

웹 서버가 어떤 방식 으로든 파일을 "수정"하여 "돕는"것이 문제 일 수 있습니까?

로컬 상자에서 작동하고 qa 상자에서 작동하지 않는 HTTP 응답 헤더를 살펴 보았지만 약간 차이가 있지만 담배가 전혀 보이지 않았습니다.

내가 거부 한 다른 생각으로는 콘텐츠 길이 값이 너무 작 으면 콘텐츠를 손상시킬 수 있다고 생각하기 때문에 콘텐츠 길이가 가능성으로 생겼습니다 ...하지만 그 이유는 분명하지 않습니다. 나는 그것이 zip을 얻고 하나의 파일을 다운로드하려고 할 때 작은 zip을 얻으려고 시도하기 때문에 그것이 정확하게 생각하지 않는다 ... 여러 파일을 다운로드하는 것은 나에게 훨씬 더 큰 zip을 준다. 따라서 오류가 기록되지 않는다는 사실과 함께 zip 유틸리티가 파일을 정확하게 찾고 압축하는 문제를 해결할 수 있다고 생각합니다.

다음은 헤더입니다.

내 개발 시스템의 응답 헤더

HTTP/1.1 200 OK 
Date: Wed, 02 Jan 2013 21:59:31 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Content-Disposition: attachment; filename="MsdsRequest-2013-59-02-165931.zip" 
Transfer-Encoding: chunked 
Cache-Control: private 
Content-Type: application/zip 

품질 보증 시스템 (작동하지 않는)

HTTP/1.1 200 OK 
Date: Wed, 02 Jan 2013 21:54:37 GMT 
Server: Microsoft-IIS/6.0 
P3P: CP="NON DSP LAW CUR TAI HIS OUR LEG" 
SVR: 06 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Content-Disposition: attachment; filename="MsdsRequest-2013-54-02-165437.zip" 
Cache-Control: private 
Content-Type: application/zip 
Set-Cookie: (cookie junk removed);expires=Wed, 02-Jan-2013 21:56:37 GMT;path=/;httponly 
Content-Length: 16969 

하지 아무것도 때문에이 접근하기가 주장하는 방법을 확인에 응답 헤더 (작업) 실패. 웹 서버 구성 문제가 될 수 있다고 생각합니다 (더 좋은 아이디어가 없으므로). 그러나 어디에서 봐야할지 모르겠습니다. 내가 취할 수있는 전술이 있니?

+0

두 가지, 첫째로는 두 번째로이 핸들러의 GZIP 별도의 압축을 해제, 우편을 보내 핸들러를 사용합니다. – Aristos

답변

1

당신이 바로이 Flush()로 후 페이지에 End()을주고 미스가 있듯이 :

... 
     zip.Save(Response.OutputStream); 
    } 
    Response.Flush(); 
    Response.End(); 
} 

그러나이 zip 파일을 보낼 페이지를 사용하는 올바른 방법이 아니다, 아마 IIS 또한 gzip 페이지 및 이것도 문제가 발생할 수 있습니다. The correct way is to use a handler 또한 gzip 압축을 사용하면 IIS에서 ether를 구성하여 해당 처리기에 대한 추가 gZip 압축을 피하십시오.

예를 download.ashx의 이름과 핸들러 귀하의 경우와 같은 것을 위해 :

public void ProcessRequest(HttpContext context) 
    { 
     string[] fileNames = Request.QueryString["requests"].Split(',');   
     context.Response.ContentType = "application/zip";   
     string archiveName = String.Format("MsdsRequest-{0}.zip", DateTime.Now.ToString("yyyy-mm-dd-HHmmss"));   
     context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + archiveName + "\""); 

     // render direct 
     context.Response.BufferOutput = false; 

     using (ZipFile zip = new ZipFile()) 
     { 
     foreach (string fileName in fileNames) 
     { 
      zip.AddFile(String.Format(SiteSettings.PdfPath + "{0}.pdf", msdsFileName), ""); 
     } 
     zip.Save(context.Response.OutputStream); 
     } 
    } 
+0

IIS가 파일을 자동으로 gzip 처리하는 방법이 문제를 일으킬 수 있는지는 명확하지 않습니다. 파일을 자동으로 압축하고 압축을 해제하면 파일이 변경되지 않습니다 (no)? – Beska

+0

글쎄, 왜 * gzip aspect가 문제인지 이해하지 못했음에도 불구하고, 어떤 테스트를 거친 후에, 가장 확실하게 * 문제가된다. 그래서 너에게 소품을, 내 친구. – Beska

+0

@ 베스 카 모든 읽기 압축 파일의 gZip이 문제를 일으킬 수 있습니다. 예를 들면 다음과 같습니다. http://stackoverflow.com/questions/13701648/ie-scrambles-script-in-iis7-with-static-compression-turned-on – Aristos