2012-02-10 4 views
1

Я изучаю кэширование вывода 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-адреса), то texbox пуст.

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

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

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

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

+0

[Этот ответ] (http://stackoverflow.com/a/2417947/66849) утверждает, что выходной кеш использует либо данные формы, либо параметры строки запроса. Это объясняет поведение, которое вы испытываете. – PHeiberg

ответ

1

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

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

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

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

+0

Извинения за задержку в принятии. Большое спасибо за ответ, особенно отправную точку в Reflector. –