OutputCache от пользователя.Ошибка при выходе - PullRequest
3 голосов
/ 14 марта 2012

Я сделал GetVaryByCustomString, который возвращает:

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

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

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

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

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

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

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

ОБНОВЛЕНИЕ: я думаю, что кэш для изменяемых значений просто не работает. Нужно, чтобы браузеры тоже кэшировали по этим значениям .... И не существует Vary by Cookies ...

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

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

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

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

0 голосов
/ 14 марта 2012

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

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

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

РЕДАКТИРОВАТЬ: Я только что понял, что вы основываетесь непосредственно на системе аутентификации, и поэтому может быть гораздо сложнее реализовать что-то нестандартное, как вышеописанное, и поэтому я бы проигнорировал мой ответ, хотя япо-прежнему рекомендуем вам проверить, можете ли вы прикрепить запросстроковый параметр для ваших URL.

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

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

...