2012-03-14 3 views
3

Я сделал GetVaryByCustomString, который возвращает:OutputCache пользователя. Ошибка, когда я выйти из системы

context.User.Identity.IsAuthenticated.ToString(); 

Но у меня есть большая проблема, представьте себе этот поток:

  1. Пользователь (или кто) доступ к домашней странице. GetVaryByCustomString вернет «ложь» и кэш. Каждый раз, когда кто-то спрашивает, изменилась ли домашняя страница, вернется 304.

  2. Я захожу на сайт и перехожу на домашнюю страницу, GetVaryByCustomString возвращает «true», тогда кеш не используется. Каждый раз, когда я перехожу на главную страницу, ASP.NET возвращает мне 304.

  3. Я выхожу из системы и перехожу на домашнюю страницу, теперь GetVaryByCustomString возвращает 304 из-за первого шага, но OutputCache не знает, что кеш что у меня есть, из зарегистрированного пользователя.

Если я нажимаю Ctrl + F5, это работает, так как проблема в браузере/сервере, кеш-сервер на стороне сервера. Но он возвращает 304, и у меня зарегистрирована страница с кэшем.

Есть любое решение? Или мне нужно остановить кэширование аутентифицированных пользователей?

UPDATE: Я думаю, что кеш для изменяемых значений просто не работает. Необходимо, чтобы браузеры также кэшировали эти значения ... И не существует Вари с помощью Cookies ...

+0

Лично я рекомендую не кэшировать для аутентифицированных пользователей (но все же кэшировать для них статические ресурсы). Вот как это делает Stack Overflow/Stack Exchange. –

+0

Я пытался кэшировать только на сервере для пользователей auth, но, похоже, у него ошибка, возвращающая 304 + no-cache. Теперь я не кэширую для зарегистрированных пользователей, и все в порядке. –

ответ

0

В качестве обходного пути вы можете отслеживать, что пользователь уже вышел из системы, и предоставить другой вывод для Пользователь.

Хотя верно, что вы хотите, чтобы вышедший пользователь на той же странице, что и пользователь, который никогда не входил в систему, все же вы можете использовать одну и ту же страницу, но добавить некоторые пробелы, которые в любом случае игнорируются браузером.

Вы можете отслеживать пользователя с отключенным пользователем с помощью переменной cookie или сеанса, однако, если после выхода из системы вы сразу перенаправляетесь на домашнюю страницу, вы можете использовать MVC TempData, которая идеально подходит для вас, поскольку вы необходимо только во время перенаправления и даже после обновления страницы (и в классическом ASP.Net вы можете использовать строку запроса вместо этого)

EDIT: Я только что понял, что вы основываетесь непосредственно на системе аутентификации и как таковая может быть гораздо сложнее реализовать что-то обычное, как выше, и как таковое я проигнорировал бы свой ответ, хотя я бы все же рекомендовал вам проверить, можно ли прикрепить параметр строки запроса к вашим URL-адресам.

Однако, поскольку вы в MVC, если я прав, фильтр OutputCache в методе действий должен работать совместно с фильтром авторизации даже без getvartbycustomstring, и, возможно, это не имеет проблемы, но в случае, если я неправильно у вас есть опция в MVC, чтобы написать пользовательский.

Также вы можете подумать о том, что все, что визуализируется html.renderAction, по умолчанию не является частью кеша, и вы должны обходным путем, поэтому вы можете попробовать это для решения, если ваша входная версия находится очень близко к вашему не входит в систему.

+0

На самом деле домашняя страница была всего лишь примером. Мне это нужно на всех страницах. Я думаю, что мне нужно будет кэшировать только на сервере, когда пользователь регистрируется в –

+0

Если фильтр OutputCache в методах действий является решением, тогда ваша проблема должна быть решена полностью –

1

В конце концов, что мы сделали, большинство веб-сайтов, в том числе SO: кэширует страницу с информацией ZERO о текущем пользователе.

Используя AJAX, узнайте, кто является текущим пользователем и управляет страницей в соответствии с ними.

Пример: кнопка «Follow/Unfollow» в профиле участника. Отобразить кэшированную страницу без логики того, кто был пользователем. Как только страница загружается, нажмите на сервер с помощью AJAX, проверяя, идет ли текущий пользователь или нет, и соответственно измените состояние кнопки.

 Смежные вопросы

  • Нет связанных вопросов^_^