Почему Response.Redirect иногда вытаскивает из кеша? - PullRequest
5 голосов
/ 18 января 2010

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

Я не используюКэширование вывода или что-то особенное в .Net здесь - это CRM, и кеширование происходит либо на клиенте, либо, что более вероятно, автоматически в IIS.

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

Я сделалнемного копаться, и некоторые люди обойти это с помощью Server.Transfer (который на самом деле ведет себя иначе, чем Response.Redirect и некоторые детали не всегда желательны), а некоторые другие люди сказали, чтобы установить Response.Cache.SetCacheability (HttpCacheability.NoCache) на странице, где я хочу избежать кеширования.

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

Есть мысли?

Ответы [ 2 ]

6 голосов
/ 18 января 2010

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

Так что да, вам нужно что-то вроде: -

Response.Cache.SetCacheability(HttpCacheability.NoCache) 

для обеспечения того, чтобы запрос (перенаправление или иным образом) не просто использовал кэшированную версию.

5 голосов
/ 18 января 2010

Response.Redirect отправляет браузеру ответ, который сообщает, что запрошенный объект был перемещен, и предоставляет ему новое местоположение.В этом случае, если вы перенаправляете на «redirect.aspx», если браузер имеет этот элемент в кэше, он будет отображаться оттуда при условии, что критерии кеширования выполнены.Вы имеете в виду Server.Transfer.Это механизм на стороне сервера для передачи контекста выполнения на новую страницу.Итак, пользователь запрашивает «main.aspx» в вашем приложении.На этой странице вы перешли на Server.Transfer на "Transfer.aspx".На стороне сервера это тот же запрос, поэтому при выводе в браузер клиента будет отображаться URL-адрес «main.aspx», а не «Transfer.aspx».

Подводя итог - Redirect =2 запроса, перевод = 1 запрос.Надеюсь, это поможет.

И да, вам нужно установить кэширование, если вы хотите, чтобы страницы всегда обращались к серверу.По умолчанию aspx не имеет специального поведения браузера, так как он просто отправляет html.Вы можете установить:

Response.Expires = -1, например.

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