Кэширование вывода, загрузка страницы и обратная передача - кажется, что есть две версии кэшированной страницы - PullRequest
1 голос
/ 10 февраля 2012

Я изучаю кэширование вывода 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 генерируется для каждой обратной передачи. Все еще гуглил ...

1 Ответ

1 голос
/ 13 февраля 2012

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

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

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

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

...