asp.net-mvc – VaryByParam =“*”是否也读取了RouteData.Values?

在我的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,已经考虑到了.如果要根据某个自定义值进行更改,请使用VaryByCustomGetVaryByCustomString来完成此操作.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....