OutputCache VaryByParam因参数不同而不同

时间:2015-05-12 12:39:34

标签: c# asp.net-mvc outputcache

我在MVC 5中使用OutputCache来缓存服务器上的视图。

我只想根据查询字符串中的两个参数缓存视图。

行动方法

[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" });

网址

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

这很有效,正确绑定数据,但是,如果我更改了URL的{name}部分的任何部分,它仍会生成新的缓存项,即使在我的操作中方法I#spefficied 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是一个通过它int值绑定的枚举。调试ActionResult

时,对此的绑定是正确的

编辑2 由于我被要求显示ProductCategoryType,我已将其添加到下方。我在调试时确实绑定了 - 我不认为它与问题有任何关系。

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

编辑3

将网址更改为: http://localhost:17191/a/products/view/2/1?name=test1&quoteid=123

缓存现在按预期工作 - 但是如何通过路由更漂亮的URL实现这一目标?

1 个答案:

答案 0 :(得分:2)

使用VaryByParam的机制专门针对实际原始HTTP请求的查询字符串或post参数,并且不知道将该原始请求映射到其他形式的任何URL路由。因此,在您的情况下,它根本不会看到id或quoteid参数(因为它们实际上不在原始请求的查询字符串或帖子中)。

然而,它会注意到URL本身(在任何'?'之前,包括名称之前)是不同的,并且对此有不同的缓存。

您可能需要考虑使用VaryByCustom。有关示例,请参阅here。还有一个非常类似的SO问题示例here