禁用ASP.NET MVC 3中的ChildAction上的服务器端输出缓存,或因客户端而异

问题描述

| 我正在开发一个Intranet,其中有一个PartialView通过jQuery每x秒刷新一次(出于调试目的,每3秒刷新一次)。同时,我在PartialView操作上使用了“ 0”指令。 用于刷新的JavaScript如下:
<script type=\"text/javascript\">
    $(document).ready(function () {
        setInterval(function () {
            $(\"#partial_1\").load(\'@Url.Action(\"_News\",\"Home\",new { id = 1 })\');
        },3000);
    });
</script>
当前_News操作如下:
    [OutputCache(Duration=3)]
    public ActionResult _News(int id)
    {
        /* random stuff to get news AND the reason why it should be on per-client-basis
           is that this also contains logic for authentification
        */
        return PartialView();
    }
只要只有一个用户,这一切都可以正常工作。 当几个用户访问该页面时会出现问题,因为所有用户都看到相同的版本。 完全禁用此操作的outputcaching将起作用,但是简单地删除[OutputCaching]指令将不起作用。如果我这样做,则每次jQuery刷新发生时,都会加载partialview的缓存版本。我可以更改正在缓存哪个版本的局部视图的唯一方法是直接使用using3加载局部视图。 ChildActions不允许使用NoStore属性,因此也不是解决方案。 我考虑过使用varyByParam属性,但是我不确定如何实现此方法以根据用户而有所不同,在这种情况下,User.Identity就足够了。     

解决方法

        您可以尝试将缓存位置强制到客户端,以便每个用户(客户端)都有自己的缓存版本。
[OutputCache(Duration=3,Location=OutputCacheLocation.Client)]
    ,        您将要利用Output Caching的VaryByCustom属性。这将使您为每个用户拥有一个唯一的缓存版本(或您确定的一些其他唯一的缓存键)。