2010-02-23 14 views
1

이전에 업로드 한 데이터베이스에서 저장 한 이진 PDF 파일을 클라이언트에 반환하는 ASP.net 응용 프로그램이 있습니다.IE6에서 PDF 첨부 파일을 표시하는 방법

인터넷 익스플로러 6 (내 삶의 이야기!)을 제외한 모든 브라우저에서 정상적으로 작동하는 코드입니다. IE6에서 사용자가 열 때 Adobe는 "이 문서를 여는 동안 오류가 발생했습니다. 파일을 찾을 수 없습니다."라는 오류를보고합니다.

사용자가 저장을 클릭하면 PDF가 저장되어 두 번 클릭하여 열 수 있습니다. 나는 곤두박질 친다. Google은 캐싱 (개인용으로 cachecontrol 설정) 제안을했지만 나는 그 중 아무것도 시도했지만 아무것도 효과가 없었습니다.

처음 ASP에서 .net 서버 레이어 (NFop 사용)에서 PDF를 생성 할 때 IE가 똑같이 열립니다! (동일한 코드 사용)!

  • ASP .NET 3.5
  • IE6.0.2900.2180.xpsp_s
  • : 여기
    // Firefox doesn't like spaces in filenames. 
        filename = filename.Replace(" ", "_"); 
    
        string extension = Path.GetExtension(filename); 
    
        string contentType; 
    
        switch (extension) 
        { 
         case "pdf": 
          contentType = "application/pdf"; 
          break; 
         default: 
          contentType = "application/x-unknown"; 
          break; 
        } 
    
        context.Response.Clear(); 
        context.Response.AddHeader("content-disposition", "attachment;filename=" + filename); 
        context.Response.Charset = ""; 
        context.Response.ContentType = contentType; 
        context.Response.BinaryWrite(data); 
        context.Response.Flush(); 
    

    응용 프로그램 버전입니다 : 여기

    와이어를 통해 이진 데이터를 전송하는 내 코드입니다
  • 목록 항목
  • p2_gdr.091208-2028
  • 어도비 리더 버전 8.0.0
  • 윈도우 XP SP 2
  • SQL 서버

어떤 도움 2008/제안은 많이 주시면 감사하겠습니다. 감사합니다 :)

편집 :

내가 헤더를 볼 수 피들러에 연결하고 있는지 충분히 그것을 캐싱 문제가 될 것으로 보인다 않습니다. grrr!

내 NFop PDF (작동하는 페이지)를 업로드하면 cache-control = private가 전송됩니다. 첨부 파일 PDF (작동하지 않는 PDF)를 업로드하면 no-cache가 전송됩니다.

Response 객체를 조사한 결과 context.Response.Flush()를 호출 할 때 두 객체가 모두 동일한 헤더를 가지고있는 것처럼 보입니다.

여전히 엉망진창입니다!

이 해결 : 우리의 프레임 워크

어딘가에 반사하여 호출되고 있었다 불량 방법이었다

/// 요청의 expiratoin을 설정하고 어떤 캐시를 강제하지 ///를 /// protected void SetCacheExpiration (HttpContext context) { // 즉시 만료되도록 캐시를 설정합니다. context.Response.Cache.SetCacheability (HttpCacheability.NoCache); context.Response.Cache.SetSlidingExpiration (true); context.Response.Cache.SetExpires (DateTime.Now); context.Response.Cache.SetMaxAge (새 TimeSpan (0, 0, 0)); context.Response.Cache.SetNoStore(); context.Response.Cache.SetAllowResponseInBrowserHistory (false); context.Response.Cache.SetValidUntilExpires (false); context.Response.Cache.SetRevalidation (HttpCacheRevalidation.AllCaches);

} 

감사합니다. 캐싱을 부탁드립니다. 실제로 다운로드를 캐시하지 않은 유일한 브라우저 (열 때)는 IE6이었습니다.

+1

'Path.GetExtension (fileName)'을 호출해야합니다. – SLaks

+0

팁 주셔서 감사합니다! :) – Russell

+0

'Path.GetExtension (fileName)'에는'.'가 포함됩니다. – SLaks

답변

0

어딘가에는 불량 반사를 사용하여 호출되고 있었다 방법이었다! 실제로 다운로드를 캐시하지 않은 유일한 브라우저 (열 때)는 IE6이었습니다.

1

여기는 IE6의 경우 the method I've used before to render in-browser PDFs입니다. 다시 ... 이것은 우리가 브라우저에 PDF를 보여준 프로젝트를위한 것이지만, 독자에게 보여지는 PDF를 위해 당신을 잘 지원할 것입니다. 당신의 도움, 캐싱

/// <summary> 
    /// Sets the expiratoin of the request and force no cache 
    /// </summary> 
    protected void SetCacheExpiration(HttpContext context) 
    { 
     //sets the cache to expire immediately 
     context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     context.Response.Cache.SetSlidingExpiration(true); 
     context.Response.Cache.SetExpires(DateTime.Now); 
     context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0)); 
     context.Response.Cache.SetNoStore(); 
     context.Response.Cache.SetAllowResponseInBrowserHistory(false); 
     context.Response.Cache.SetValidUntilExpires(false); 
     context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 

    } 

감사합니다 : 우리의 프레임 워크