7

次の方法で、カスタム HTTP ハンドラーで出力キャッシュを使用しています。

    public void ProcessRequest(HttpContext context)
    {
        TimeSpan freshness = new TimeSpan(0, 0, 0, 60);
        context.Response.Cache.SetExpires(DateTime.Now.Add(freshness));
        context.Response.Cache.SetMaxAge(freshness);
        context.Response.Cache.SetCacheability(HttpCacheability.Public);
        context.Response.Cache.SetValidUntilExpires(true);
        ...
    }

動作しますが、問題は F5 でページを更新すると、最後のコードラインにもかかわらず (キャッシュの使用ではなく) ページが再生成されることです。

context.Response.Cache.SetValidUntilExpires(true);

助言がありますか?

UPD: 問題の原因は、HTTP ハンドラーの応答がサーバーにキャッシュされていないことです。次のコードは Web フォームではうまく機能しますが、ハンドラーではうまく機能しません。

        Response.Cache.SetCacheability(HttpCacheability.Server);

サーバーでの http ハンドラー応答のキャッシュの詳細はありますか?

4

2 に答える 2

18

その理由がわかりました。URL でクエリ文字列パラメーターを使用しているため、「http://localhost/Image.ashx?id=49」のようになります。VaryByParams が明示的に設定されていない場合、context.Response.Cache.VaryByParams.IgnoreParams はデフォルトで false であるため、サーバーは常に id param の値を考慮すると考えました。しかし実際には、この場合、サーバーはキャッシュをまったく使用しません (ユーザーのブラウザーは使用しますが)。

したがって、パラメーターがクエリ文字列で使用されている場合は、Response.Cache.VaryByParams を明示的に設定する必要があります。

context.Response.Cache.VaryByParams.IgnoreParams = true;

パラメータを無視するため、または

context.Response.Cache.VaryByParams[<parameter name>] = true;

いくつかのパラメータによる変動または

context.Response.Cache.VaryByParams["*"] = true;

すべてのパラメータによる変動。

于 2010-06-09T10:42:28.897 に答える
0

パブリック キャッシュ可能性は、ユーザーのブラウザまたはプロキシに依存し、応答がクライアントおよび共有 (プロキシ) キャッシュによってキャッシュ可能であることを指定します。

使ってみましたかHttpCacheability.Server

http://msdn.microsoft.com/en-us/library/system.web.httpcacheability(v=VS.71).aspx

于 2010-06-08T20:58:39.047 に答える