4

Web サービス呼び出しのクライアント側キャッシュを実装しようとしています。Web からの情報に基づいて、以下のコード 1に示すようにSetCachingPolicy()関数に従って実行できました。

Web メソッドの RetrieveX では正常に機能するようになりましたが、RetrieveY メソッドでは機能しませんでした。RetrieveX にはパラメーターがなく、RetrieveY には 1 つの文字列パラメーターがあることに気付きました。Fiddler で調べたところ、RetrieveY からの Web サービス呼び出しの HTTP GET 要求には、パラメーターのクエリ文字列があるようです。

これまでのクエリ文字列なしのすべての HTTP GET Web サービス呼び出しは適切にキャッシュを実行していますが、クエリ文字列を含むこの呼び出しではキャッシュを実行していません。

Fiddler で調べると、RetrieveX には次のキャッシュ情報が出力 1にあり、RetrieveY には出力 2に情報があることがわかります。

これはこのキャッシング方法の制限ですか、それともクライアント側で RetrieveY のキャッシングを機能させるために何かできることはありますか?


コード 1: SetCachingPolicy

private void SetCachingPolicy()
{
  HttpCachePolicy cache = HttpContext.Current.Response.Cache;
  cache.SetCacheability(HttpCacheability.Private);
  cache.SetExpires(DateTime.Now.AddSeconds((double)30));

  FieldInfo maxAgeField = cache.GetType().GetField(
      "_maxAge", BindingFlags.Instance | BindingFlags.NonPublic);
  maxAgeField.SetValue(cache, new TimeSpan(0, 0, 30));
}

コード 2: RetrieveX

[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod(UseHttpGet = true)]
public string[] RetrieveX()
{
  SetCachingPolicy();       
  // Implementation details here.
  return array;
}

コード 3: 取得 Y

[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod(UseHttpGet = true)]
public string[] RetrieveY(string arg1)
{
  SetCachingPolicy();       
  // Implementation details here.
  return array;
}

出力 1: RetrieveX キャッシュ情報

HTTP/200 responses are cacheable by default, unless Expires, Pragma, or Cache-Control headers are present and forbid caching.
HTTP/1.0 Expires Header is present: Wed, 12 Sep 2012 03:16:50 GMT

HTTP/1.1 Cache-Control Header is present: private, max-age=30
    private: This response MUST NOT be cached by a shared cache.
    max-age: This resource will expire in .5 minutes. [30 sec]

出力 2: RetrieveY キャッシュ情報

HTTP/200 responses are cacheable by default, unless Expires, Pragma, or Cache-Control headers are present and forbid caching.
HTTP/1.0 Expires Header is present: -1

Legacy Pragma Header is present: no-cache

HTTP/1.1 Cache-Control Header is present: no-cache
    no-cache: This response MUST NOT be reused without successful revalidation with the origin server.
4

1 に答える 1

1

私もこの問題に遭遇しました、私は私が私のために働いたものを共有したいと思いました。根本的な問題は、VaryByParamsが応答に設定されていないことです。これをSetCachingPolicy()メソッドに追加すると、RetrieveYは期待どおりに機能し始めるはずです。

cache.VaryByParams["*"] = true
于 2012-10-02T20:18:43.643 に答える