0

ASP.NET 4.5 でアプリケーションを開発しています。Webサービスをセットアップしました。Web サービスは、GET Ajax 呼び出しを使用して Jquery によってアクセスされます。この関数には「id」パラメーターがあり、id ごとに異なるコンテンツが返されます。

サーバーとクライアントの両方でそのデータをキャッシュしたい。クライアントでは、「CacheDuration」の使用方法は既に知っていますが、問題はクライアント側にあります。HttpFox を使用して、各応答のヘッダーを取得します。

関数の先頭に次のコードを設定しました。

    HttpCachePolicy cache = HttpContext.Current.Response.Cache;
    cache.SetCacheability(HttpCacheability.Private);
    cache.SetExpires(DateTime.Now.AddMinutes((double)10));
    cache.SetMaxAge(new TimeSpan(0, 0, 10));


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

私がやりたいことは、クライアントが同じ ID に対して再度リクエストを送信するのを防ぎ、それを 10 分間行うことです。したがって、最初の呼び出しで要求が行われ、応答 200 が返されます。2 回目の応答ヘッダーは 304 になります。

現在、上記のコードはそれを行っていません。それを達成する方法を知りたいです。繰り返しますが、私は 304 を返すクライアント側のキャッシュについて話しているので、キャッシュの有効期限が切れるまで、同じ「id」を求めてサーバーに再度アクセスしたいと考えています。

コードを使用して実行できることはわかっているので、IIS タイプのソリューションを提出しないでください。

これを解決するにはあなたの助けが必要です。

4

1 に答える 1

1

最後に変更されたヘッダーを実装する必要があります

Response.Cache.SetLastModified(lastWriteTime.Value.ToUniversalTime());

これにより、クライアントは最後に変更された値を確認でき、再フェッチはできなくなります。

理論的には、次を使用して、最後に変更された時間を10分単位で偽造することができます。

public static DateTime Round10(this DateTime value)
{   
    var ticksIn10Mins = TimeSpan.FromMinutes(10).Ticks;

    DateTime dtReturn = (value.Ticks % ticksIn10Mins == 0) ? value : new DateTime((value.Ticks / ticksIn15Mins + 1) * ticksIn10Mins);
    if(dtReturn > DateTime.Now())
    {
        return dtReturn.AddMinutes(-10); 
    } else {
        return dtReturn;
    }
}


Response.Cache.SetLastModified(Round10(DateTime.Now);

このコードはテストされていませんが

于 2012-07-04T15:38:50.303 に答える