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.