OutputCache VaryByParam зависит от параметра, который не должен быть включен

Я использую OutputCache в MVC 5 для кэширования представления на сервере.

Я хочу только кэшировать представление на основе двух параметров в строке запроса.

Метод действия

[HttpGet]
[OutputCache(Location = OutputCacheLocation.Server, Duration = 60*10, VaryByParam = "id;quoteid")]
public ActionResult MyAction(int id, ProductCategoryType category)
{
    return Content(DateTime.Now.ToString());
}

Маршрут

context.MapRoute(
"MyCustomRoute",
"myarea/{controller}/{action}/{id}/{category}/{name}/{quoteId}",
new { controller = "MyController", name = UrlParameter.Optional, quoteId = UrlParameter.Optional },
new[] { "MyNamespace.Areas.MyArea.Controllers" });

URL

http://localhost:17191/myarea/mycontroller/myaction/2/1/a-holiday/aquoteid

Это работает и правильно связывает данные, однако, если я изменю какую-либо часть {name} части URL-адреса, он все равно создаст новый элемент кеша, хотя в моем методе действия я указал VaryByParam="id;quoteid"

Например...

http://localhost:17191/myarea/mycontroller/myaction/2/1/a-holiday/somequoteid

и

http://localhost:17191/myarea/mycontroller/myaction/2/1/another-holiday/somequoteid

... генерируют разные выходные данные DateTime - но они не должны - они должны быть идентичными.

Что я сделал не так и как добиться желаемого поведения?


Изменить

Просто чтобы было ясно, ProductCategoryType - это Enum, который связан через его значение int. Привязка для этого правильная, когда я отлаживаю ActionResult

Редактировать 2 Поскольку меня попросили показать ProductCategoryType, я добавил его ниже. Это правильно связывается при отладке - я не думаю, что это имеет какое-то отношение к проблеме.

public enum ProductCategoryType
{
    TourActivity = 1,
    Accommodation = 2,
    BusPass = 3,
    SelfDrive = 4,
}

Изменить 3

Изменение URL-адреса на: http://localhost:17191/a/products/view/2/1?name=test1&quoteid=123

И кеш теперь работает так, как ожидалось, но как мне добиться этого с более красивым URL-адресом через маршрутизацию?


person Alex    schedule 12.05.2015    source источник
comment
Можете ли вы показать нам свою модель ProductCategoryType?   -  person freshbm    schedule 12.05.2015
comment
@freshbm Это не модель - это перечисление. Я все же добавлю это к вопросу.   -  person Alex    schedule 12.05.2015
comment
Итак, где вы привязываете свой quoteId в своем действии, вы должны привязать его, если не хотите использовать его как параметр в VaryByParam   -  person freshbm    schedule 12.05.2015
comment
@freshbm Если я изменю quoteId, даже не привязывая его, он правильно кешируется. Проблема все еще остается, если я изменяю часть параметра name.   -  person Alex    schedule 12.05.2015
comment
Релевантно: stackoverflow.com/a/865003/7724, и я думаю, что, поскольку ядро ​​IIS определяет, следует ли обслуживать запрос от разрешение кеша, контроллера и действия происходит слишком поздно, чтобы красивые URL-адреса могли варьироваться в зависимости от параметра. Но я не могу предоставить ссылку на это.   -  person bzlm    schedule 12.05.2015


Ответы (1)


Механизм, использующий VaryByParam, действует конкретно на строку запроса или параметры публикации фактического необработанного HTTP-запроса и не знает о каких-либо URL-маршрутизациях, отображающих этот необработанный запрос в какую-либо другую форму. Таким образом, в вашем случае он вообще не увидит параметры id или quoteid (поскольку они фактически не находятся в строке запроса или сообщении необработанных запросов).

Однако он заметит, что сам URL-адрес (перед любым '?', включая имя) отличается, и изменит кеширование на этом.

Возможно, вам придется подумать об использовании VaryByCustom. Пример см. здесь. И есть очень похожий пример SO-вопроса здесь.

person Thogek    schedule 13.07.2015