ASP.NET Core ResponseCaching:子页面缓存key的坑

最近在做一些老的asp.net mvc 老项目迁移到asp.net core。 其中有很小坑都有的介绍,园子里面有很多人都已经填满了,但是我遇到[OutputCache]到[ResponseCache]的坑 没看到有解决就记录下。

responsecache 理解起来简单,介绍也很多。就不多说明。下面说说这个小坑

当一个A页面嵌入了一个子页面B,这个子页面的action上面也用了标记例如:[ResponseCache(Duration = 30, VaryByQueryKeys = new string[] { "currentPage" })],那么访问多次A页面就算每次传递不同的参数,A页面也内容也不会变。于是翻了翻源码  看看,原来是因为缓存的key的值用的子页面B的参数......

(中间还穿插一个坑:.net core 3.0 后有一个breaking change,IResponseCachingKeyProvider changed to internal,无法自己继承实现,所以切回到.net core2.2测试)

 

 

 

 

 

 

 

图片中的源码是ResponseCachingKeyProvider 中缓存key的生成方法。可以看到key里面有子页面参数className,但是没有主页面的currentPage。也就是说当主页面穿插了子页面,子页面用了responsecache,那么只会使用子页面的VaryByQueryKeys或者默认前缀作为key。

解决办法:因为子页面和主页面的上下文里面使用的是相同的url参数,并且看到源码里面有个判断:VaryByQueryKeys是“ * ”星号,那么地址参数匹配。 所以只要把子页面的VaryByQueryKeys中的参数换成星号就能解决

 

posted @ 2020-12-29 17:38  TeemoHQ  阅读(146)  评论(0编辑  收藏  举报