Request.IsAuthenticated проблема с кэшем в ASP.NET - PullRequest
1 голос
/ 26 марта 2010

Я новичок в ASP.NET и у меня проблема ...

Когда я хочу кешировать, я вижу или Действие, как это:

<%@ 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

Теперь я устала пробовать все, что приходило мне на ум ... не могли бы вы помочь мне, пожалуйста! :)

Julien.

Ответы [ 2 ]

3 голосов
/ 27 марта 2010

Во-первых, в приложении MVC не использует директиву <%@ OutputCache %> в представлении.Кэширование должно выполняться на уровне контроллера, а не на уровне просмотра.Используйте атрибут [OutputCache] вместо <%@ OutputCache %>.См. http://www.asp.net/learn/mvc/tutorial-15-cs.aspx для примера того, как это сделать.

Вы можете установить для свойства OutputCacheAttribute.VaryByCustom какое-то пользовательское значение и проверить его из Global.asax, переопределив GetVaryByCustomString method.

Стивен Смит имеет пример этого в своем блоге .Обратите внимание, что его пример нацелен на WebForms вместо MVC, поэтому вам нужно будет использовать [OutputCache] вместо <%@ OutputCache %>, но общая идея та же.И вы, вероятно, захотите вернуть «аутентифицирован» или «не аутентифицирован», так как это все, что вам нужно;не похоже, что вам нужно фактическое имя пользователя, вошедшего в систему.(Кэширование вывода для каждого пользователя, как правило, является плохой идеей, так как вы быстро заполняете кэш, если вошли много пользователей.)

Особо следует отметить, что не не используют Response.WriteSubstitution () из приложения MVC.Response.WriteSubstitution () - это точка расширения, специфичная для WebForms, и ее поведение в приложении MVC не определено, поскольку MVC не выполняет конвейер WebForms полностью.Нет гарантии, что он будет работать правильно.

1 голос
/ 26 марта 2010

По определению, вы кэшируете страницу, и полученная страница не будет изменена.Поэтому, как только вы кешируете его с помощью Request.IsAuthenticated == True, он будет продолжать отображать этот результат и не будет регенерироваться до тех пор, пока не истечет срок действия кеша или другие условия, которые вы предъявляете для этого.Я думаю, что вам нужно, если вы кешируете его, это две разные страницы: одна для аутентифицированных пользователей и одна для неаутентифицированных пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...