문제

ASP.NET 2.0의 브라우저로 PDF를 스트리밍하고 있습니다.이는 HTTP를 통한 모든 브라우저와 모든 브라우저에서 작동합니다. 제외하고 HTTPS를 통한 IE.내가 아는 한, 이 방법은 지난 5년 정도 동안 모든 IE 버전에서 작동했지만 고객은 최근에야 문제를 보고하기 시작했습니다.나는 의심한다 암호화된 페이지를 디스크에 저장하지 않음 보안 옵션은 기본적으로 비활성화되어 있었지만 어느 시점에서 기본적으로 활성화되었습니다(인터넷 옵션 -> 고급 -> 보안).이 옵션을 끄면 해결 방법으로 도움이 되지만 장기적인 솔루션으로는 실행 가능하지 않습니다.

내가 받는 오류 메시지는 다음과 같습니다.

Internet Explorer는 www.sitename.com에서 OutputReport.aspx를 다운로드할 수 없습니다.

Internet Explorer가 이 인터넷 사이트를 열 수 없습니다.요청한 사이트를 사용할 수 없거나 찾을 수 없습니다.나중에 다시 시도 해주십시오.

PDF를 만드는 데 사용되는 도구는 ActiveReports입니다. 데이터다이내믹스.PDF가 생성되면 이를 전송하는 코드는 다음과 같습니다.

Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=statement.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()  

메모:캐시 제어를 명시적으로 지정하지 않으면 .NET이 나를 대신하여 no-cache를 보내므로 캐시 제어를 다음과 같이 설정해 보았습니다.private, public 또는 maxage=#이지만 그 중 아무 것도 작동하지 않는 것 같습니다.

반전은 다음과 같습니다.응답 헤더를 검사하기 위해 Fiddler를 실행하면 모든 것이 잘 작동합니다.내가 받는 헤더는 다음과 같습니다.

HTTP/1.1 200 확인
캐시 제어:최대 연령=1
날짜:2009년 7월 29일 수요일 17:57:58 GMT
컨텐츠 타입:신청서/pdf
섬기는 사람:마이크로소프트-IIS/6.0
마이크로소프트오피스웹서버:5.0_펍
X-Powered-By:ASP.NET
X-AspNet 버전:2.0.50727
내용 처리:부착;파일명=statement.pdf
콘텐츠 인코딩:gzip
달라지다:수락-인코딩
전송 인코딩:덩어리진

Fiddler를 끄고 다시 시도하자마자 다시 실패합니다.제가 알아차린 또 다른 점은 Fiddler가 실행 중일 때 다음과 같은 메시지가 표시된다는 것입니다. 이 웹사이트의 보안 인증서에 문제가 있습니다 경고 메시지가 표시되며 클릭해야 합니다. 이 웹사이트로 이동(권장하지 않음) 통과하기 위해.Fiddler가 꺼져 있으면 이 보안 경고가 발생하지 않으며 즉시 실패합니다.

Fiddler가 실행 중일 때는 작동하지만 그렇지 않을 때는 작동하지 않도록 Fiddler와 브라우저 사이에 무슨 일이 일어나고 있는지 궁금합니다. 더 중요한 것은 PDF를 IE로 스트리밍하면 변경 없이 작동하도록 코드를 변경할 수 있는 방법을 아는 사람이 있습니까? 클라이언트 머신에?

업데이트: Fiddler 문제가 해결되었습니다. EricLaw에게 감사드립니다. 이제 Fiddler 실행 여부에 관계없이 일관되게 작동합니다.

Google 검색에 따르면 웹 전체에 이와 동일한 문제에 대한 많은 보고서가 있는 것으로 보이며 각 보고서에는 개별 사례에 대한 문제를 해결하는 것으로 보이는 응답 헤더의 고유한 조합이 있습니다.저는 ETag, LastModified 날짜 추가, Vary 헤더 제거(Fiddler 사용), Cache-Control 및/또는 Pragma 헤더의 수십 가지 조합을 포함하여 이러한 제안 중 많은 것을 시도했습니다.나는 "Content-Transfer-Encoding:바이너리' 및 ContentType의 경우 'application/force-download'.지금까지 아무것도 도움이 되지 않았습니다.있다 약간의 마이크로소프트 KB 조항, 모두 다음을 나타냅니다. 캐시 제어:캐시 없음 범인입니다.다른 아이디어가 있나요?

업데이트: 그런데 완전성을 위해 Excel 및 Word 출력에서도 이와 동일한 문제가 발생합니다.

업데이트: 아무런 진전이 이루어지지 않았습니다.Fiddler에서 EricLaw로 .SAZ 파일을 이메일로 보냈더니 IE를 디버깅할 때 문제를 재현할 수 있었지만 아직 해결 방법이 없습니다.현상금이 만료됩니다 ...

도움이 되었습니까?

해결책 2

Wild Goose Chase에서 2 주 후에, 나는 PDF, Excel 또는 Word 문서를 스트리밍하는이 방법을 허용하는 코드 변경 조합을 찾을 수 없었습니다.암호화 된 페이지를 디스크에 저장하지 마십시오'옵션이 켜져 있습니다.

Microsoft는이 동작이 여러 KB 기사와 개인 이메일의 설계에 의한 것이라고 말했다. 그것은 '암호화 된 페이지를 디스크에 저장하지 마십시오'옵션이 켜져 있습니다. IE가 올바르게 행동하고 말하는 것을 수행하고 있습니다. 이 게시물 지금까지 찾은 최고의 리소스는 왜이 설정이 활성화 될 것인지와 그것을 활성화의 장단점을 설명합니다.

"암호화 된 페이지를 디스크에 저장하지 마십시오'SSL (HTTPS) 연결을 다룰 때'작동합니다. 웹 서버가 파일을 캐시하는 방법에 대한 정보를 보낼 수있는 것처럼 웹 서버가 할 수있는 경우에 상관없이 SSL (HTTPS) 연결 중에 파일을 캐시에 저장하지 않도록 인터넷 익스플로러를 기본적으로 설정할 수 있습니다.

이 기능을 켜는 장점은 무엇입니까? 보안은 기능이 켜지는 가장 큰 이유입니다. 페이지는 임시 인터넷 파일 캐시에 저장되지 않습니다.

단점은 무엇입니까? 느린 성능은 캐시에 저장되지 않으므로 1 바이트 GIF 이미지가 페이지에 12 번 사용 된 1 바이트 GIF 이미지가 매번 웹 서버에서 가져와야합니다. 문제를 악화시키기 위해 다운로드 된 파일과 같은 일부 사용자 조치가 실패 할 수 있으며 PDF 문서가 제시되거나 PDF 문서를 열면 몇 가지 시나리오가 실패합니다. "

이 시점에서 우리가 찾을 수있는 가장 좋은 솔루션은이 설정을 사용하는 대안이 존재한다는 고객과 사용자에게 전달하는 것입니다.

"브라우저가 닫히면 '빈 임시 인터넷 파일 폴더 사용'사용 브라우저가 닫을 때마다 브라우저의 다른 인스턴스 또는 일부 외부 애플리케이션의 파일에 잠금이 없다고 가정하면 모든 파일이 캐시에서 퍼지됩니다.

활용하기 전에 많은 고려 사항을 제공해야합니다.암호화 된 페이지를 디스크에 저장하지 마십시오'. 훌륭한 보안 기능처럼 들리지만이 기능을 사용한 결과로 인해 헬프 데스크 호출이 다운로드 실패 또는 느린 성능을 위해 증가 할 수 있습니다. "

다른 팁

당신의 캐시 제어 헤더가 잘못되었습니다. 그것은해야한다 캐시 제어 : MAX-AGE = 1 중간에 대시가 있습니다. 먼저 차이가 있는지 확인하십시오.

일반적으로, 나는 가장 가능성이 높은 범인은 다양한 헤더라고 말합니다. 이러한 헤더는 종종 즉, 캐싱에 문제가 발생하기 때문입니다. http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx. 추가 해보고 싶을 수도 있습니다 에타그 응답 헤더에.

피들러는 캐시 가능성에 영향을 미치지 않아야하며 (규칙을 작성하지 않는 한), 그것이 말하는 것처럼 들립니다. 아마도 어떤 종류의 타이밍 문제가 있음을 시사합니다.

> 암호화 된 페이지를 기본적으로 비활성화했던 디스크 보안 옵션에 저장하지 마십시오.

이 옵션 ~이다 IT 관리자는 그룹 정책을 통해이를 켤 수 있지만 일부 주요 회사는 그렇게 할 수 있지만 (IE6, 7 및 8) 기본적으로 여전히 비활성화되었습니다.

또한 Fiddler를 실행하는 동안 인증서 오류가 표시되는 이유는 Fiddler Root 인증서를 신뢰하기로 결정하지 않았기 때문입니다. 보다 http://www.fiddler2.com/fiddler/help/httpsdecryption.asp 이 주제에 대한 자세한 내용.

스트리밍하려는 PDF 파일에도 비슷한 문제가 있었습니다.심지어 Response.ClearHeaders() 런타임에 Pragma 및 Cache-Control 헤더가 추가되는 것을 보았습니다.해결책은 IIS에서 헤더를 지우는 것이었습니다(PDF를 로드하는 페이지에서 마우스 오른쪽 버튼 클릭 -> 속성을 ​​클릭한 다음 "Http 헤더" 탭).

나는 이것이 나에게 효과가있는 것 같다는 것을 알았다.

Dim browser As System.Web.HttpBrowserCapabilities = Request.Browser
If (browser.Browser = "IE") Then
  Response.AppendHeader("cache-control", "private") ' ie only
Else
  Response.AppendHeader("cache-control", "no-cache") ' all others (FF/Chrome tested)
End If

해결 : 이것은 IE 문제입니다. http://support.microsoft.com/kb/323308그것은 오랫동안 시도한 후에 나에게 적합합니다.

ATT : Mr.Dark

우리는 오랫동안 비슷한 문제에 직면 해 왔습니다. 우리가 한 일은 우리 (이것은 Java EE)였습니다. 웹 응용 프로그램 구성에서 추가합니다

<mime-mapping>
    <extension>PDF</extension>
    <mime-type>application/octet-stream</mime-type>
</mime-mapping>

이렇게하면 웹 애플리케이션에서 나오는 PDF가 렌더링을 시도하는 브라우저 대신 다운로드 할 수 있습니다.

편집하다: 스트리밍하는 것 같습니다. 이 경우 CODE가 아닌 코드에서 MIME 타입을 응용 프로그램/Octet-stream으로 사용합니다. 그래서 여기서 대신

Response.ContentType = "application/pdf"

당신은 사용할 것입니다

Response.ContentType = "application/octet-stream"

IE의 어떤 버전? Microsoft가 출시 한 것을 기억합니다 IE6 용 핫픽스 이 문제의 경우. 그것이 약간 사용되기를 바랍니다.

캐시 제어 거위 체이스를 읽었지만 공유하겠습니다. 내, 그것은 내 필요를 충족시켰다, 도움이되는 경우.

GZIP 압축을 비활성화하십시오.

누군가가 링크를 통과하는 대신 유용하다는 것을 알기를 바라고 여기에 추가합니다.

여기 내 코드가 있습니다

    byte[] bytes = // get byte array from DB

    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    Response.Buffer = true;

    // Prevent this page from being cached.
    //  NOTE: we cannot use the CacheControl property, or set the PRAGMA header value due to a flaw re: PDF/SSL/IE
    Response.Expires = -1; 

    Response.ContentType = "application/pdf";
    // Specify the number of bytes to be sent
    Response.AppendHeader("content-length", bytes.Length.ToString());

    Response.BinaryWrite(bytes);    

            // Wrap Up
    Response.Flush();
    Response.Close();
    Response.End();

OP처럼 나는 이것을 작동 시키려고 며칠 동안 내 머리를 긁고 있었지만 결국 그것을했기 때문에 헤더의 '조합'을 공유 할 것이라고 생각했다.

            if (System.Web.HttpContext.Current.Request.Browser.Browser == "InternetExplorer"
                && System.Web.HttpContext.Current.Request.Browser.Version == "8.0")
            {
                System.Web.HttpContext.Current.Response.Clear();
                System.Web.HttpContext.Current.Response.ClearContent();
                System.Web.HttpContext.Current.Response.ClearHeaders();
                System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";

                System.Web.HttpContext.Current.Response.AppendHeader("Pragma", "public");
                System.Web.HttpContext.Current.Response.AppendHeader("Cache-Control", "private, max-age=60");
                System.Web.HttpContext.Current.Response.AppendHeader("Content-Transfer-Encoding", "binary");

                System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + document.Filename);
                System.Web.HttpContext.Current.Response.AddHeader("content-length", document.Data.LongLength.ToString());

                System.Web.HttpContext.Current.Response.BinaryWrite(document.Data);
            }

어딘가에 누군가가 고통을 구하기를 바랍니다!

SSL을 통해 PDF를 스트리밍하고 iframe 또는 객체 안에 넣으려고 시도하는 비슷한 문제가 발생했습니다. 내 ASPX 페이지가 보안 보안 버전의 URL 버전으로 계속 리디렉션 할 것이며 브라우저가 차단 될 것임을 알게되었습니다.

ASPX 페이지에서 ASHX 핸들러로 전환하면 리디렉션 문제가 해결되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top