在我的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方法将卖方作为参数.我通过始终提供不同的卖家参数来测试它,但它从缓存中获取输出而不是调用方法.
设置VaryByParam =“*”也会因为asp.net mvc中的RouteData.Values而异吗?
我正在使用ASP.Net 4 MVC 3 RC 2
解决方法
输出缓存机制因URL,QueryString和Form而异.这里没有表示RouteData.Values.原因是输出缓存模块在路由之前运行,因此当第二个请求进入并且输出缓存模块正在寻找匹配的缓存条目时,它甚至没有要检查的RouteData对象.
通常这不是问题,因为RouteData.Values直接来自URL,已经考虑到了.如果要根据某个自定义值进行更改,请使用VaryByCustom和GetVaryByCustomString来完成此操作.