12

ASP.NET 2.0 のブラウザーに PDF をストリーミングしています。これは、HTTP 経由のすべてのブラウザー、およびHTTPS 経由の IE を除くすべてのブラウザーで機能します。私の知る限り、これは IE のすべてのバージョンで (過去 5 年間ほど) 機能していましたが、クライアントから問題が報告され始めたのはごく最近のことです。暗号化されたページをディスクに保存しないというセキュリティ オプションがデフォルトで無効になっていて、ある時点でデフォルトで有効になったのではないかと思います ([インターネット オプション] -> [詳細] -> [セキュリティ]) 。このオプションをオフにすると、回避策として役立ちますが、長期的な解決策としては実行できません。

私が受け取っているエラーメッセージは次のとおりです。

Internet Explorer は、www.sitename.com から OutputReport.aspx をダウンロードできません。

Internet Explorer はこのインターネット サイトを開くことができませんでした。要求されたサイトは利用できないか、見つかりません。後でもう一度やり直してください。

PDF の作成に使用されるツールは、DataDynamicsの 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()  

注: cache-control を明示的に指定しないと、.NET が代わりに no-cache を送信するため、cache-control を private または public または maxage=# に設定しようとしましたが、どれも機能していないようです。

ひねりがあります。Fiddler を実行して応答ヘッダーを検査すると、すべて正常に動作します。私が受け取るヘッダーは次のとおりです。

HTTP/1.1 200 OK
Cache-Control: max-age=1
Date: Wed, 29 Jul 2009 17:57:58 GMT
Content-Type: application/pdf
サーバー: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By : ASP.NET
X-AspNet-Version: 2.0.50727
content-disposition: attachment; filename=statement.pdf
Content-Encoding: gzip
Vary: Accept-Encoding
Transfer-Encoding: チャンク

Fiddler をオフにして再試行するとすぐに、再び失敗します。私が気付いたもう 1 つのことは、Fiddler が実行されているときに、この Web サイトのセキュリティ証明書に問題がありますという警告メッセージが表示れることです。Fiddler がオフの場合、このセキュリティ警告は表示されず、すぐに失敗します。

Fiddler とブラウザの間で何が起こっているのか知りたいので、Fiddler が実行されているときは機能しますが、実行されていないときは壊れますが、さらに重要なことに、コードを変更して PDF を IE にストリーミングすると、変更を加えることなく機能する方法を知っている人はいますか?クライアントマシンに?

更新: Fiddler の問題は解決されました。EricLaw に感謝します。したがって、一貫して動作するようになりました (Fiddler の実行の有無にかかわらず、壊れています)。

Google の検索に基づくと、この同じ問題のレポートがウェブ全体にたくさんあるようです。それぞれのケースで問題を解決しているように見える応答ヘッダーの独自の組み合わせがあります。ETag、LastModified 日付の追加、Vary ヘッダーの削除 (Fiddler を使用)、および Cache-Control や Pragma ヘッダーの多数の組み合わせなど、これらの提案の多くを試しました。「Content-Transfer-Encoding: binary」と ContentType の「application/force-download」を試しました。これまでのところ何も役に立ちませんでした。Microsoft KBの記事がいくつか ありますが、そのすべてがCache-Control: no-cacheが原因であることを示しています。他のアイデアはありますか?

更新:ところで、完全を期すために、これと同じ問題が Excel および Word の出力でも発生します。

更新:進展はありません。Fiddler から EricLaw に .SAZ ファイルを電子メールで送信したところ、彼は IE のデバッグ中に問題を再現できましたが、まだ解決策はありません。バウンティの有効期限が切れる...

4

12 に答える 12

3

Cache-Controlヘッダーが正しくありません。中央にダッシュがあるCache-Control: max-age=1である必要があります。最初にそれを修正してみて、違いが生じるかどうかを確認してください。

通常、Vary ヘッダーが原因である可能性が最も高いと言えます。このようなヘッダーは、IE のキャッシュで問題を引き起こすことがよくあります: http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx。応答ヘッダーにETAGを追加してみてください。

Fiddler は (ルールを作成していない限り) キャッシュ可能性に影響を与えるべきではありません。また、そう言っているように聞こえますが、おそらく何らかのタイミングの問題があることを示唆しています。

>暗号化されたページをディスクに保存しないセキュリティ オプションは、デフォルトで無効になっていました

このオプションデフォルトで (IE6、7、および 8 では) 無効のままですが、IT 管理者はグループ ポリシーを介して有効にすることができ、一部の大手企業は有効にしています。

ちなみに、Fiddler の実行中に証明書エラーが表示されるのは、Fiddler ルート証明書を信頼することを選択していないためです。このトピックの詳細については、 http://www.fiddler2.com/fiddler/help/httpsdecryption.aspを参照してください。

于 2009-07-30T18:49:22.757 に答える
2

ストリーミングしたいPDFファイルでも同様の問題がありました。Response.ClearHeaders()実行時に追加された Pragma ヘッダーと Cache-Control ヘッダーを見たにもかかわらず。解決策は、IIS のヘッダーをクリアすることでした (PDF をロードしているページで右クリック -> [プロパティ]、[HTTP ヘッダー] タブ)。

于 2011-01-17T15:51:57.223 に答える
2

これは私にとってはうまくいくように見えました:

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
于 2010-07-15T23:36:00.847 に答える
2

野生のガチョウの追跡で2週間後、「暗号化されたページをディスクに保存しない」オプションがオンになっているときに、PDF、Excel、またはWordドキュメントをストリーミングするこの方法を可能にするコード変更の組み合わせを見つけることができませんでした.

Microsoft は、多くの KB 記事やプライベート メールで、この動作は設計によるものだと述べています。[暗号化されたページをディスクに保存しない] オプションがオンになっている場合、IE は正しく動作し、指示どおりに動作しているようです。 この投稿は、この設定が有効になる理由と、有効にすることの長所と短所を説明している、これまでに見つけた最高のリソースです。

「「暗号化されたページをディスクに保存しない」は、SSL (HTTPS) 接続を処理するときに有効になります。Web サーバーがファイルをキャッシュする方法に関する完了情報を送信できるように、基本的に Internet Explorer を設定してファイルを保存しないようにすることができます。 SSL (HTTPS) 接続中のキャッシュは、Web サーバーがアドバイスするかどうかに関係なく。

この機能をオンにする利点は何ですか。この機能をオンにする最大の理由はセキュリティです。ページはインターネット一時ファイルのキャッシュには保存されません。

マイナス面は何ですか?ページで 1 バイトの gif 画像を何度も使用しても、キャッシュには何も保存されないため、パフォーマンスが低下します。毎回 Web サーバーから取得する必要があります。さらに悪いことに、ダウンロードしたファイルが削除されたり、エラーが表示されたり、PDF ドキュメントを開くことができないなど、一部のユーザー アクションが失敗する可能性があります。」

この時点で見つけられる最善の解決策は、この設定を使用する代替手段があることをクライアントとユーザーに伝えることです。

「「ブラウザーを閉じるときに一時インターネット ファイル フォルダーを空にする」を使用します。ブラウザーを閉じるたびに、ブラウザーの別のインスタンスまたは外部アプリケーションからファイルがロックされていないと仮定して、すべてのファイルがキャッシュから削除されます。

「暗号化されたページをディスクに保存しない」を利用する前に、多くの考慮が必要です。優れたセキュリティ機能のように思えますが、この機能を使用すると、ダウンロードの失敗やパフォーマンスの低下のためにヘルプ デスクへの問い合わせが増える可能性があります。」

于 2009-08-11T18:28:37.497 に答える
1

解決済み:これはIEの問題であり、アプリケーションによるものではありません...これで修正してください: http ://support.microsoft.com/kb/323308 長い間試した後、私にとっては完璧に機能します。

ATT:ダークさん

于 2011-05-18T16:22:22.867 に答える
1

私たちはずっと前に似たような問題に直面してきました。Web アプリケーション構成で追加します

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

これにより、ブラウザーがレンダリングしようとする代わりに、Web アプリケーションからの pdf がダウンロードされるようになります。

編集:ストリーミングしているようです。その場合、config ではなく、コードで MIME タイプを application/octet-stream として使用します。だからここでは代わりに

Response.ContentType = "application/pdf"

あなたが使用します

Response.ContentType = "application/octet-stream"
于 2009-08-11T05:13:57.133 に答える
0

私はあなたのキャッシュコントロールグースチェイスについて読みましたが、それが助けになる場合に備えて、私のニーズを満たした私のものを共有します。

于 2009-08-10T19:47:03.007 に答える
0

SSL 経由で PDF をストリーミングし、これを iframe またはオブジェクト内に配置しようとすると、同様の問題が発生しました。aspx ページがセキュリティで保護されていないバージョンの URL にリダイレクトし続け、ブラウザーがそれをブロックすることがわかりました。

ASPX ページから ASHX ハンドラーに切り替えると、リダイレクトの問題が解決することがわかりました。

于 2015-04-17T17:23:09.253 に答える
0

IEのバージョンは?Microsoftがこの問題に対して IE6 の Hotfix をリリースしたことを思い出します。それが役に立つことを願っていますか?

于 2009-07-29T19:00:39.433 に答える
0

誰かがリンクをたどる代わりにこれが役立つことを期待して、ここに追加します。

これが私のコードです

    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();
于 2012-02-08T00:12:16.937 に答える
0

gzip 圧縮を無効にしてみてください。

于 2009-08-11T11:31:58.020 に答える