2009-09-17 5 views
5

Я пытаюсь использовать OutputCaching на моем веб-сайте ASP.NET MVC. Проблема в том, что когда я пытаюсь изменить значение одного из параметров моего запроса, он возвращает данные для первого элемента, который был запрошен!Кэширование не работает прямо на моем веб-сайте ASP.NET MVC?

Вот мой код (с именами Param изменены) ...

[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, если выбрано/было выбрано исключение.

и вот два примера вызовов я готовлю к этому действию: -

поэтому данные из первого вызова (Foo = hello world, Pew Pew) возвращается как 200 OK. Затем второй вызов api возвращает 200 OK, но с данными предыдущего вызова.

Кроме того, я не использую прокси-сервер. Если я прокомментирую атрибут OutputCache, все хорошо.

Я также попытался следующие (вручную перечисляя каждый раз, когда мне нужно кэш) .....

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

Не везёт :(

Обратите внимание, как мне нужно, чтобы убедиться, что я включите параметр API «Key» как часть уникального ключа кеша. Я не хочу, чтобы люди искали то же самое, но если у второго человека нет правильного ключа, они не должны получать кешированный результат , но сообщение об ошибке (технически, это 401 Not Authorized, но в любом случае) ...

Thou ghts?

ответ

4

Список параметров в VaryByParam должен быть разделен точкой с запятой, а не запятой. Попробуйте. Тем не менее, * должно было работать.

+0

+1 более непосредственно сфокусированный на вопросе под рукой в ​​порядке. хотя я не думаю, что это единственная проблема, которую он имеет здесь. ответил на ваш комментарий ниже. – dove

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 как свойство, может обеспечить, но звучит, как вы знаете, что делать.

+0

Из интереса, почему же вы создали свой собственный атрибут здесь? –

+0

Я применил несколько просмотров и сделаю больше. Я не был на 100% на точных настройках, которые вы видите выше, и поэтому я легко мог настроить и знать, что это было применено повсюду.Я все еще не исправил, добавлять ли дополнительные заголовки при настройке кеша. Конечно, если я нахожу, что это плохая идея, я могу сделать это чистым расширением атрибута OutputCache и ничего не потерять. Короче говоря, было что-то получить с четким путем к безопасности, если возникнет риск. – dove

+0

Нет ничего плохого в том, что он сделал здесь, но он не отвечает на ваш вопрос. Созданный им фильтр влияет на кеширование * браузера *, а не на кеширование сервера. Это законно, и я не знаю ничего встроенного в ASP.NET MVC, который это делает. Это также, неявно, делает хороший момент, а именно, что здесь играют два разных кэша: один в браузере и тот, что на сервере. Мне кажется, что ваш вопрос связан с кешем сервера, хотя было бы неплохо проверить это с помощью Firebug или Fiddler. –