OutputCacheAttribute怎么实现移动和PC不同缓存

qvbzyx 2017-10-03 09:50:23
移动和PC版是不同的UI输出,那么启用缓存的时候,就会起冲突,可以使用VaryByCustom实现,但是不同UI返回值不同,就会刷新上次缓存,这样并不完美,能否实现PC和移动单独缓存,单独输出?

我是MVC项目,重写OnResultExecuting函数,System.Web 源码没法调试,所以来请教各位了。
...全文
399 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qvbzyx 2017-10-05
  • 打赏
  • 举报
回复
引用 6 楼 webdiyer 的回复:
[quote=引用 3 楼 sp1234 的回复:] 谁跟你说的“不同UI返回值不同,就会刷新上次缓存”呢?当不同客户端访问页面时,随着 GetVaryByCustomString 函数输出的不同结果,asp.net 会拿出不同的缓存页面进行输出。谁跟你说的“会刷新上次缓存”?你是怎么测试的?
我估计他是想当然地认为是这样[/quote] 哈哈,不好意思了,麻烦了两位大神,测试结果出现异常是因为我重写了OnResultExecuting函数,修改了OutputCacheParameters的一个变量造成的,看了system.web.page的源码,发现重写InitOutputCache是可以实现的,但是函数是internal,也不必多此一举,谢谢两位,节日快乐
webdiyer 2017-10-05
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
谁跟你说的“不同UI返回值不同,就会刷新上次缓存”呢?当不同客户端访问页面时,随着 GetVaryByCustomString 函数输出的不同结果,asp.net 会拿出不同的缓存页面进行输出。谁跟你说的“会刷新上次缓存”?你是怎么测试的?
我估计他是想当然地认为是这样
webdiyer 2017-10-04
  • 打赏
  • 举报
回复
就是用VaryByCustom,我的实现方式:
public override string GetVaryByCustomString(HttpContext context, string custom)
        {
            if (custom.ToLowerInvariant() == "ismobile" && context.Request.Browser.IsMobileDevice)
            {
                return "mobile";
            }
            return base.GetVaryByCustomString(context, custom);
        }
  • 打赏
  • 举报
回复
谁跟你说的“不同UI返回值不同,就会刷新上次缓存”呢?当不同客户端访问页面时,随着 GetVaryByCustomString 函数输出的不同结果,asp.net 会拿出不同的缓存页面进行输出。谁跟你说的“会刷新上次缓存”?你是怎么测试的?
  • 打赏
  • 举报
回复
页面输出缓存结束,比如说(webform为例,其它的平台只要是 .net 下的也一样)
<%@ OutputCache VaryByCustom="abc" Duration="600000" VaryByParam="none" %>
public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if (custom == "abc")
    {
        var key = context.Request.QueryString["key"];
        if (key != null)
            return key;
    }

    return base.GetVaryByCustomString(context, custom);
}
那么你可以测试,比如说当你以QueryString参数 key 为什么值(包括不给这个值) 测试时,即使你重启页面,只要是 web 服务没有重启,那么你永远都看到的是过去的那个页面。比如说,在不同页面,查看 http://xxxx/default.aspx 你看到的是30分钟之前的页面,http://xxx/default.aspx?key=1 你看到的是18分钟前的页面,http://xxx/default.aspx?key=2 你看到的是15分钟前的页面,三个页面不论怎么刷新,怎么”切换“,你看到的都是过去的页面。 何来的”就会刷新上次缓存“之说?
  • 打赏
  • 举报
回复
引用 2 楼 qvbzyx 的回复:
如果Mobile和PC切换访问,会不停的刷新缓存。
人家 asp.net 的 VaryByCustomString 不可能连多客户端各自有不同的页面、有不同的 GetVaryByCustomString 函数输出值都想不到。你还是仔细测试自己的代码吧。
qvbzyx 2017-10-04
  • 打赏
  • 举报
回复
引用 1 楼 webdiyer 的回复:
就是用VaryByCustom,我的实现方式:
public override string GetVaryByCustomString(HttpContext context, string custom)
        {
            if (custom.ToLowerInvariant() == "ismobile" && context.Request.Browser.IsMobileDevice)
            {
                return "mobile";
            }
            return base.GetVaryByCustomString(context, custom);
        }
这个和VaryByCustom=“”brower”是一样的道理。不可以这样的,如果Mobile和PC切换访问,会不停的刷新缓存。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧