【问题标题】:How not cache an ASP.NET user control?如何不缓存一个 ASP.NET 用户控件?
【发布时间】:2010-11-18 09:13:45
【问题描述】:

我在具有用户控件的页面中使用 OutputCache,但我不想缓存此特定用户控件,因为它与用户登录相关(如果我访问该页面,我看到的页面就像我已与另一个用户进行身份验证)。

我该怎么做?

【问题讨论】:

    标签: asp.net caching


    【解决方案1】:

    我个人使用 VaryByCustom 属性为登录和注销的用户提供不同的缓存页面视图:

    <%@ OutputCache VaryByCustom="IsLoggedIn" Duration="30" VaryByParam="*" %>
    

    然后在 global.asax 你放

    public override string GetVaryByCustomString(HttpContext context,
        string arg)
    {
        if (arg == "IsLoggedIn")
        {
    
            if (context.Request.IsAuthenticated)
            {
                return "Logged in: " + context.User.Identity.Name;
            }
            else
            {
                return "Not Logged In";
            }
    
        }
        else
        {
            return base.GetVaryByCustomString(context, arg);
        }
    
    }
    

    我只是要把这个扔出去。替代控制怎么样?

    http://msdn.microsoft.com/en-us/library/ms228212.aspx

    根据msdn网站:

    替换控件可让您 在页面上创建区域 动态更新然后 集成到缓存页面中。 ... 替代控制提供了一个 部分页面的简化解决方案 缓存大多数页面 的内容被缓存。你可以 输出缓存整个页面,然后 使用替换控件来指定 页面中豁免的部分 来自缓存。

    我从未亲自使用过替代控件,但我前几天碰巧查了一下,听起来它可以以某种方式将更新的内容注入到其他缓存的页面输出中。

    【讨论】:

      【解决方案2】:

      您可以缓存页面,也可以缓存用户控件,但不能缓存除用户控件之外的页面。当用户控件运行时,整个页面都必须运行。您必须使页面的输出缓存能够识别不同的用户。

      如果用户身份存储在 cookie 中,您可以使用 VaryByHeader="Cookie" 为每组 cookie 缓存页面。您可以使用VaryByCustom="SomeString" 并在Global.asax 中的GetVaryByCustomString 方法中实现对SomeString 的检查,以自行检查用户身份。

      【讨论】:

        【解决方案3】:

        您可以创建缓存过滤器:http://weblogs.asp.net/rashid/archive/2008/03/28/asp-net-mvc-action-filter-caching-and-compression.aspx

        检查此过滤器是否用户已登录。

        【讨论】:

          猜你喜欢
          • 2010-09-07
          • 1970-01-01
          • 2011-03-03
          • 1970-01-01
          • 2010-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多