Request.IsAuthenticated问题与ASP.NET中的缓存

时间:2010-03-26 20:26:26

标签: c# asp.net asp.net-mvc caching

我是ASP.NET的新手,我遇到了问题...

当我想要缓存I View或这样的Action时:

<%@ Page title="" language="C#" masterpagefile="~/Views/Shared/MemberHome.Master" inherits="System.Web.Mvc.ViewPage<IndexViewData>" %>
<%@ OutputCache duration="400" varybyparam="divId;regionId;page" %> 

我知道它会缓存我页面中的所有数据......但是在我的页面中我有这样的条件:

 <% if(Request.IsAuthenticated) { %>
                <a href="/fr/Advertiser/Search"><img src="/content/images/v_2/bot.jpg" alt="Entreprises liées à vos passions" title="Entreprises liées à vos passions" /></a>
            <% } else { %>
                <a href="/fr/Advertiser/OpenSearch"><img src="/content/images/v_2/bot.jpg" alt="Entreprises liées à vos passions" title="Entreprises liées à vos passions" /></a>
            <% } %>    

我不想缓存这个变量:Request.IsAuthenticated ...因为某些结果取决于这个条件......我尝试scottgu的甜甜圈缓存,但它返回(我认为)只是一些文字而不是bool ... http://weblogs.asp.net/scottgu/archive/2006/11/28/tip-trick-implement-donut-caching-with-the-asp-net-2-0-output-cache-substitution-feature.aspx

现在我已经厌倦了尝试任何我想到的东西..你能帮我一下! :)

于连。

2 个答案:

答案 0 :(得分:3)

首先,在MVC应用程序中,在视图上使用<%@ OutputCache %>指令。缓存应该在控制器级别完成,而不是在视图级别完成。使用[OutputCache]属性代替<%@ OutputCache %>。有关如何执行此操作的示例,请参阅http://www.asp.net/learn/mvc/tutorial-15-cs.aspx

您可以将OutputCacheAttribute.VaryByCustom属性设置为某个自定义值,并通过覆盖GetVaryByCustomString方法从Global.asax进行检查。

史蒂芬史密斯有一个这样的例子on his blog。请注意,他的示例针对WebForms而不是MVC,因此您需要使用[OutputCache]而不是<%@ OutputCache %>,但总体思路是相同的。并且您可能希望返回“已验证”或“未经验证”,因为这是您需要的所有粒度;它似乎不需要实际登录的用户名。 (无论如何,每个用户的输出缓存通常都是一个坏主意,因为如果许多用户登录,您将快速填充缓存。)

特别值得注意的是,在MVC应用程序中使用Response.WriteSubstitution()。 Response.WriteSubstitution()是一个WebForms特定的可扩展点,由于MVC不完整地运行WebForms管道,因此它在MVC应用程序中的行为是未定义的。无法保证它能正常工作。

答案 1 :(得分:1)

根据定义,您正在缓存页面,并且不会修改生成的页面。因此,一旦使用Request.IsAuthenticated == True缓存它,它将继续显示该结果,并且在缓存过期或您出现的其他条件指示它之前不会重新生成。我认为,如果你的缓存,你需要的是两个不同的页面:一个用于经过身份验证的用户,另一个用于未经身份验证的用户。