VaryByParam =“*”还读取RouteData.Values吗?

时间:2010-12-23 12:16:47

标签: asp.net-mvc asp.net-mvc-3 outputcache

在我的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;
    }

}

然后,action方法将seller作为参数。我通过总是提供不同的seller参数来测试它,但它从缓存中获取输出而不是调用方法。

设置VaryByParam =“*”也会因为asp.net mvc中的RouteData.Values而异吗?

我正在使用ASP.Net 4 MVC 3 RC 2

2 个答案:

答案 0 :(得分:7)

输出缓存机制因URL,QueryString和Form而异。这里没有表示RouteData.Values。原因是输出缓存模块在路由之前运行,所以当第二个请求进入并且输出缓存模块正在寻找匹配的缓存条目时,它甚至没有要检查的RouteData对象

通常这不是问题,因为RouteData.Values直接来自URL,已经考虑到了。如果您想要根据某个自定义值进行更改,请使用VaryByCustomGetVaryByCustomString来完成此操作。

答案 1 :(得分:3)

如果删除VaryByParam =“*”,它应该在缓存时使用您的操作方法参数值。

  

ASP.NET MVC 3的输出缓存系统不再需要您   声明[OutputCache]时指定VaryByParam属性   Controller操作方法的属性。 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
    }
}