5

ASP.NETMVCWebサイトでOutputCachingを使用しようとしています。問題は、クエリ文字列パラメータの1つの値を変更しようとすると、要求された最初のアイテムのデータが返されることです。

これが私のコードです(パラメータ名が変更されています)...

[ApiAuthorize]
[HandleErrorAsJson]
public class SearchController : Controller
{
    [AcceptVerbs(HttpVerbs.Get)]
    [OutputCache(Duration = 60, VaryByParam = "*")]
    public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew)
    {
    ..
    }
}
  • 注1:ApiAuthorize-「Key」と呼ばれるクエリ文字列パラメータをチェックし、メモリ内のディクショナリをチェックして、存在するかどうかを確認するカスタム属性。
  • 注2:HandleErrorAsJson-例外がスローされた場合にエラーメッセージをjsonとして返すカスタム属性。

これが私がこのアクションに対して行っている2つのサンプル呼び出しです:-

したがって、最初の呼び出し(foo = hello world、Pew Pew)からのデータは200OKとして返されます。次に、2番目のAPI呼び出しは200 OKを返しますが、前の呼び出しのデータを使用します。

また、プロキシサーバーを使用していません。OutputCache属性をコメントアウトすると、すべて問題ありません。

私も次のことを試しました(キャッシュする必要があるたびに手動でリストします)....。

[OutputCache(Duration = 60, VaryByParam = "foo,key,bar,pewpew")]

運がない:(

キャッシュの一意のキーの一部としてAPIの「Key」パラメータが含まれていることを確認する必要があることに注意してください。同じことを検索してほしくないのですが、2人目の人が正しいキーを持っていない場合は、キャッシュされた結果ではなく、エラーメッセージが表示されます(技術的には、401 Not Authorizedですが、いずれかの方法)...

考え?

4

2 に答える 2

4

VaryByParamのパラメーターのリストは、コンマ区切りではなく、セミコロンで区切られている必要があります。それを試してみてください。そうは言っても、*は機能するはずでした。

于 2009-09-17T13:37:11.470 に答える
0

出力キャッシュにフィルターを使用します。これにより、デバッグ用のプログラムによる制御が可能になり、必要なときに設定されます。これを自由に使用して、ここで設定することで、私が思うに違いが生じるかどうかを確認してください(以前のキャッシュがクリアされていることも確認してください)

public class CacheFilterAttribute : ActionFilterAttribute
    {
        private const int Second = 1;
        private const int Minute = 60 * Second;
        private const int Hour = 60 * Minute;
        public const int SecondsInDay = Hour * 24;


        /// <summary>
        /// Gets or sets the cache duration in seconds. The default is 10 seconds.
        /// </summary>
        /// <value>The cache duration in seconds.</value>
        public int Duration
        {
            get;
            set;
        }

        public int DurationInDays
        {
            get { return Duration / SecondsInDay; }
            set { Duration = value * SecondsInDay; }
        }

        public CacheFilterAttribute()
        {
            Duration = 10;
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (Duration <= 0) return;

            HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
            TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);

            cache.SetCacheability(HttpCacheability.Public);
            cache.SetExpires(DateTime.Now.Add(cacheDuration));
            cache.SetMaxAge(cacheDuration);
            cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
        }
    }

私はこれまでサイトの非常に静的な部分にこれを使用しているので、このような電話をかけてください

[CacheFilter(DurationInDays = 1)]

明らかに、これを拡張してVaryByParamsをプロパティとして公開し、提供することはできますが、何をすべきかを知っているように聞こえます。

于 2009-09-17T07:20:23.007 に答える