VaryByParam = "*" также читает RouteData.Values? - PullRequest
5 голосов
/ 23 декабря 2010

в моем проекте asp.net mvc я включаю кэширование вывода на контроллере, как показано ниже

[OutputCache(Duration = 100, VaryByParam = "*", VaryByHeader = "X-Requested-With")]
public class CatalogController : BaseController
{
    public ActionResult Index(string seller)
    {
        // I do something
    }
}

он прекрасно работает, пока не создам свой собственный класс Route, как показано ниже

public class MyRoute : Route
{
    // there is a constructor here..

    // I override this method.. 
    // just to add one data called 'seller' to RouteData
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var data = base.GetRouteData(httpContext);
        if (data == null) return null;

        var seller = DoSomeMagicHere();

        // add seller
        data.Values.Add("seller", seller);

        return data;
    }

}

, а затем метод действия примет seller в качестве параметра. Я проверил это, всегда предоставляя другой параметр seller, но он берет вывод из кэша вместо вызова метода.

Значения параметра VaryByParam = "*" также зависят от RouteData.Values, в asp.net mvc?

Я использую ASP.Net 4 MVC 3 RC 2

Ответы [ 2 ]

7 голосов
/ 24 декабря 2010

Механизм кэширования вывода зависит от URL, QueryString и Form.RouteData.Values ​​здесь не представлен.Причина этого заключается в том, что модуль кэширования вывода выполняется перед маршрутизацией, поэтому, когда поступает второй запрос, и модуль вывода кэширования ищет соответствующую запись в кэше, у него даже нет объекта RouteData для проверки * 1002.*.

Обычно это не проблема, так как RouteData.Values ​​исходит прямо из URL, который уже учтен.Если вы хотите изменить какое-то пользовательское значение, используйте VaryByCustom и GetVaryByCustomString , чтобы выполнить это.

3 голосов
/ 03 января 2012

Если вы удалите VaryByParam = "*", он должен использовать значения параметров вашего метода действия при кэшировании.

Система кэширования вывода ASP.NET MVC 3 больше не требует от вас укажите свойство VaryByParam при объявлении [OutputCache] атрибут метода действия контроллера. MVC3 теперь автоматически изменяет выходные кэшированные записи, когда у вас есть явные параметры для вашего метода действия - что позволяет вам чисто включить вывод ...

Источник: http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx

[OutputCache(Duration = 100, VaryByHeader = "X-Requested-With")]
public class CatalogController : BaseController
{
    public ActionResult Index(string seller)
    {
        // I do something
    }
}
...