web-dev-qa-db-ja.com

表示できないPDF HTTPSからIE 8(64ビットVistaの場合)

シンプルなファイルを提供する自家製のHTTPSサーバーがあります(アプリに埋め込まれています)。それはうまく機能します-それを永遠に使用しています。

最近追加されたSSLサポート-Chrome、FireFox、およびIEすべて同様で、ページを正常にロードします。

私が見つけた問題は、HTTPS接続を介してPDFファイルをロードしようとしたときです。何らかの理由で、PDFがIE 8(64ビットVistaの64ビット)。Chromeで正常に動作します。また、IE 8はプレーンHTTPを使用すると正常に動作します。HTTPSを使用すると失敗します。 。

注:IE 8が記載されている場合、64ビットVistaでは32ビットIE 8ですが、64ビットIE 8は同じ動作をします。

それはある種のIE 8/HTTPS/PDF/64-bit OSの問題ですが、よくわかりません。

IE 8のDebugBarは、要求と応答が期待どおりに進んだことを示します-エラーはまったくありません。IE 8はエラーや何も表示しません-真っ白な画面(またはPDFを読み込もうとする前に表示されていたページ)クリアされたキャッシュ/クッキー/など。

IE/PDF/HTTPSに既知の問題はありますか?

43
DougN

私は戻ってきて、最終的な答えをすると思いました。

「暗号化されたページをディスクに保存しないでください」と提案したすべての人に感謝します。

EricLawのアドバイスに従って設定しました。

Cache-Control: private 

また、Pragma: no-cache、削除しました。

今魅力のように動作します:)

39
DougN
response.setHeader("Cache-Control","private");

iE8とIE9で私たちのためにトリックをしました。

ブラウザの設定を変更する必要はありませんでした。

10
so_mv

私はこの同じ問題にぶつかり、ユーザーにセキュリティ設定を変更してオフにするように頼むことによってのみ動作させることができました 暗号化されたページをディスクに保存しないでください [インターネットオプション]ダイアログの[詳細設定]タブ: http://support.Microsoft.com/kb/812935

...そして すぐにパニックが終わると、コード(VBを使用したASP.NET)を調べ始めました。私はフィドラーを使用しましたが、cache-controlヘッダーを指定していなくても、フレームワークが自動的にno-storeを指定しているように見えました。この問題を解決する鍵は、実際には this PHP question にありました。cache-controlヘッダーを max-age = 1 ファイルは1秒間キャッシュされ、Adobe Readerがディスクからファイルを取得してメモリに読み込むのに十分な長さです。コードを更新して、PDFを次のように生成しました。

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

更新: 私はそれが機能していると思ったが、私はあまりにも早く話したと思う。この問題をフォローするために 新しい質問 を作成しました。

10
wweicker

IE8とhttpsでも同様の問題がありました。 pdfを新しいウィンドウにストリーミングしようとすると、代わりに空白のhtmlページが表示されました(FireFoxで機能し、httpsを介していない場合)。さまざまな種類の応答ヘッダーを検索して試行した後、解決策は次のように設定することでした:

Response.AppendHeader("Accept-Ranges", "none");

これにより、開く前にpdf全体がダウンロードされます。これは、非常に大きなpdfの場合、ユーザーフレンドリーではありません。しかし、私の場合、ほとんどのpdfはほんの数ページでした。これが誰かを助けることを願っています。

4
Daniel Lee

あなたの質問には.NETへの言及はありませんが、関連する解決策を提供します。願わくば、あなたが必要なものをそこから取り入れることができれば幸いであり、あなたの質問が.NETに関係していると想定している開発者もそこに価値を見いだすかもしれません。

これは、キャッシングなしでHTTPS経由でブラウザー内PDFをレンダリングするために以前に使用した方法です。

    private void RenderPdfToResponse(byte[] documentBytes) {
        Response.BufferOutput = true;
        Response.ClearContent();
        Response.ClearHeaders();
        Response.AddHeader("Cache-control", "no-store");
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Length", documentBytes.Length.ToString());
        Response.BinaryWrite(documentBytes);
        Response.Flush();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }

** Adob​​e ReaderがPDFファイルをロードするのに十分な時間だけ発生するpseudo-cache)があります。私が話していることを説明しているリファレンスを探しましたが、 ランダムなフォーラムスレッド が最善です:

IEはPDFを割り当てられた「揮発性」メモリに保存し、%system%Tempにポインタを置きます。これはファイルが格納される唯一の場所です。ポインタは削除され、割り当てられたメモリはすぐに解放されますAdobe Readerが閉じられているため。

その技術的な正確さを保証することはできませんが、上記の方法を使用して観察したことを反映しています。実際、ファイルはAdobe Reader(ブラウザ内)での読み込みが完了すると消えます。

3
lance

IE Vista 64で32ビットまたは64ビットバージョンを実行していますか?両方に付属しています。多くの場合、64ビットをサポートするプラグインは多くないため、32ビットバージョンが使用されます。

2つの間に違いがあるかどうかを確認します。 Vista 64でIE 8 32ビットで動作する場合、64ビットバージョンのブラウザヘルパーオブジェクト(BHO)の問題である可能性があります。

また、他のブラウザーが32ビットモードで実行されているかどうかを確認します(タスクマネージャーのプロセス名の後に「* 32」が存在するかどうかを確認します)。

HTTPSによってIE8がPDFファイルをキャッシュしない原因になっている(HTTPSトラフィックは通常キャッシュされていない)かどうかを確認するためにチェックするもう1つのこと。 procmon PDFファイルがファイルシステムに書き込まれていることに気付くかどうかを確認します。変更する必要があるポリシー設定がある可能性があります。代替方法があるかどうかわかりませんPDFがディスクに書き込まれるべきではないが、まだ表示される可能性があるということを言っている。

0
Jeff Moser

ユーザーとして、私はSchwab.comからpdfファイルを読み込むのと同じ問題を抱えていました。 [インターネットオプション]ダイアログの[詳細設定]タブで[暗号化されたページをディスクに保存しない]をオフにするアドバイス: http://support.Microsoft.com/kb/812935 ".

0
Ronnie Smith

私の解決策(これを機能させるためにヘッダーをいじるのに何日もかかりました):

            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);
            }

誰かを助けることを願っています

0
metroas