レポートファイルを返すアクションを持つMVC .Netアプリケーションがあります。通常は次の.xslx
とおりです。
byte[] data = GetReport();
return File(data,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"filename.xlsx");
これはテストとすべてのブラウザーでうまく機能しますが、これを SSL サイトに配置すると、IE6、7、および 8 で失敗し (すべての適切なブラウザーは引き続き正常に動作します)、次の役に立たないエラーが表示されます。
これは、このアクションが置き換えるレガシー アプリケーション (非 MVC) で機能していました。
ユーザーにローカルで何かを変更するように指示することはできません - 約 60% がまだ IE6 を使用しています!
MVC を使用してこれを修正するにはどうすればよいですか?
アップデート
さらに掘り下げると、これが IE6-8 の根本的な障害であることがわかります。Eric Law の IE 内部ブログによると、これは、SSL 接続中に IE が no-cache ディレクティブを絶対規則として扱うために発生します。そのため、コピーをキャッシュしないのではなく、キャッシュなしと
Content-Disposition:attachment
は、ダウンロード場所の明示的なプロンプトが表示された場合でもコピーをディスクに保存できないことを意味すると見なします。
明らかにこれは間違っていますが、IE9 では修正されていますが、IE6 から 8 までのすべてのユーザーにはまだ行き詰まっています。
MVC のアクション フィルター属性を使用すると、次のヘッダーが生成されます。
Cache-Control:no-cache, no-store, must-revalidate
Pragma:no-cache
Fiddler を使用してこれらをオンザフライで変更すると、代わりに返される必要があるヘッダーを確認できます。
Cache-Control:no-store, no-cache, must-revalidate
Cache-Control
must have no-store
before の順序とno-cache
、Pragma
ディレクティブを完全に削除する必要があることに注意してください。
これは問題です。私たちは MVC のアクション属性を広範囲に使用しており、それらを最初から書き直したくありません。Pragma
ディレクティブを削除しようとすると、IIS は例外をスローします。
Microsoft の MVC と IIS に、Microsoft の IE6-8 が HTTPS で処理できる no-cache ディレクティブを返すようにするにはどうすればよいですか? 応答のプライベート キャッシュを許可したり (この同様の質問に従って)、MVC の組み込みメソッドをオーバーライドして無視したりしたくありません(私自身の回答によると、これは私の現在の最高のハックです)。