6

を返すMVC4GETアクションメソッドがありますFileStreamResult。SSLのみを使用し、提供されたドキュメントのキャッシュを許可しないという要件が存在するため、SSLでありOutputCache、次のプロパティを持つフィルターも使用しました。

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None", Location = OutputCacheLocation.None)]

これは期待どおりに動作し、次の応答ヘッダーを生成します。

Cache-Control: no-cache, no-store
Expires: -1
Pragma: no-cache

IE8もサポートするように求められるまではすべて順調でした。また、ここにいる多くの人が、キャッシュなしのセットとSSLの両方が混在しているとダウンロードされないドキュメントに遭遇したことがあります。IE8以下の回避策は、実際には実行できないレジストリ設定を追加するか、基本的な要件に違反するキャッシュなしヘッダーを削除することです。

FiddlerとIE8を試してみたところ、プラグマを削除しただけでドキュメントをダウンロードできました。キャッシュなしのヘッダーですが、Cache-Controlヘッダーはそのまま残しました。これは私の一時的なインターネットファイルにドキュメントのコピーを残していないように見えましたが、これをもう少しテストする必要があるかもしれません。

この情報を念頭に置いて、アクションのフィルターを使用してプラグマを削除するのは簡単な作業かもしれないと思いましたが、何をしても、OutputCache設定する内容を変更することはできないようです。OutputCache属性を削除して使用しました:

Response.Cache.SetCacheability(HttpCacheability.NoCache)

このメソッドを単独で使用すると、以前と同じキャッシュ設定を確実に取得できますが、このメソッド呼び出しの時点では設定されていません。これは、応答パイプラインのある時点で適用されるキャッシュポリシーを設定するだけですが、どこにあるのかわかりません。

応答パイプラインにフックして、書き込まれているキャッシュヘッダーを変更する方法があるかどうか誰かが知っていますか?

編集パイプラインに 単純なカスタムIHttpModuleを追加しました。これは、応答内のプラグマヘッダーを検索して削除NameValueCollectionし、キャッシュコントロールが設定されている間はプラグマがありません。これは、IIS 7.5がキャッシュコントロールに表示される内容に基づいてプラグマ自体を挿入していることを意味しますか?単純なWebサイトのデフォルト以外のものを設定していないことは確かです。

編集モジュール内 のヘッダー値を確認しましたCache-Control。これはプライベートに設定されているため、キャッシュヘッダーはまだ応答に適用されていません。それで、おそらくモジュールが実行された後にキャッシュヘッダーが追加されるように見えますか?

4

1 に答える 1

1

この同じ問題のトラブルシューティングを行っていたところ、プラグマ ヘッダーを削除するという同じ問題に遭遇しました。.NET がPageオブジェクトをレンダリングすると、キャッシュ ヘッダーが出力されます。キャッシュ処理は によって制御されますHttpModule。プラグマヘッダーを削除する方法をいくつか試しましたが、役に立ちませんでした。

まだ試していない方法の 1 つは、うまくいくように見えますが、PITA のように見えますが、Response出力ストリームに を介してフィルターを実装することResponse.Filter = new MyCustomFilter(...)です。

これに先立って各所のヘッダーを確認してみましたが、出力キャッシュ処理がまだ実行されておらず、pragma header が存在せず、削除できませんでした。特に、HttpApplicationイベントPreSendRequestHeadersは機能しませんでした。

その他のオプションには、組み込みのフレームワーク バージョンを使用する代わりに独自のモジュールを実装することや、プラグマ ヘッダーがレンダリングされるクラスOutputCacheを何らかの方法でオーバーライドすることが含まれます。System.Web.HttpCachePolicy

プラグマ ヘッダーは、HttpCacheability.NoCacheオプションの一部としてレンダリングされます。

  if (httpCacheability == HttpCacheability.NoCache || httpCacheability == HttpCacheability.Server)
  {
    if (HttpCachePolicy.s_headerPragmaNoCache == null)
      HttpCachePolicy.s_headerPragmaNoCache = new HttpResponseHeader(4, "no-cache");
    this._headerPragma = HttpCachePolicy.s_headerPragmaNoCache;
    if (this._allowInHistory != 1)
    {
      if (HttpCachePolicy.s_headerExpiresMinus1 == null)
        HttpCachePolicy.s_headerExpiresMinus1 = new HttpResponseHeader(18, "-1");
      this._headerExpires = HttpCachePolicy.s_headerExpiresMinus1;
    }
  }

私が見つけた唯一の実用的なオプションは、キャッシュ制御をプライベートに設定し、URL の有効期限も短く設定することです。どちらの側でも根本原因に対処するわけではありませんが、最終的にはほぼ同じ望ましい効果が得られます.

于 2014-12-12T21:51:33.107 に答える