Кеширование вывода, загрузка страницы и обратная передача - кажется, есть две версии кешированной страницы

Я изучаю кеширование вывода ASP.NET.

Я собрал очень простую страницу (см. Ниже). Тест бесполезен; это просто для иллюстрации поведения, о котором идет речь.

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head runat="server">
            <title></title>
            <script runat="server">
                protected void Page_Load(object sender, EventArgs e)
                {
                }
                protected void Button1_Click(object sender, EventArgs e)
                {
                    TextBox1.Text = Guid.NewGuid().ToString();
                }
            </script>
        </head>
        <body>
            <form id="form1" runat="server">
                <div>
                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                    <br />
                    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
                </div>
            </form>
        </body>
</html>

Когда страница загружается в первый раз, текстовое поле пусто (как и ожидалось).

При первом нажатии кнопки текстовое поле заполняется SOMEGUID. Из моего чтения я ожидал, что он останется пустым ... поскольку страница должна была обслуживаться из кеша ...?

Для последующих нажатий кнопки содержимое текстового поля остается как SOMEGUID (до тех пор, пока не истечет срок действия кеша, и в этом случае это будет SOMEOTHERGUID).

Если я загружаю страницу на другую вкладку браузера (путем копирования и вставки URL-адреса), тексбокс будет пуст.

Если я нажму кнопку на новой странице, содержимое текстового поля изменится на SOMEGUID и останется таким (до тех пор, пока не истечет срок действия кеша, и в этом случае это будет SOMEOTHERGUID).

Итак, похоже, что в кеше есть две версии; один для только что загруженной страницы и второй для результата первого нажатия кнопки? Что случилось? Можно ли это предотвратить (в экспериментальных целях)? Я попытался установить для атрибутаvarByControl значение «none», но это не помогло ...

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

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


person J M    schedule 10.02.2012    source источник
comment
В этом ответе утверждается, что кеш вывода использует либо данные формы, либо параметры строки запроса. Это объяснило бы ваше поведение.   -  person PHeiberg    schedule 13.02.2012


Ответы (1)


Я заглянул внутрь реализации кэширования вывода (OutputCacheModule), и ключ кеша уникален на основе нескольких вещей, а именно:

  • Путь к файлу
  • Глагол (GET, POST и т. Д.)
  • Параметры VaryBy и результирующие значения этих

В вашем случае GET и POST создают два разных ключа кеша.

Обходной путь для этого ограничения дизайна опубликован в этом вопросе.

person PHeiberg    schedule 12.02.2012
comment
Приносим извинения за задержку в приеме. Большое спасибо за ответ, особенно за отправную точку в Reflector. - person J M; 04.03.2012