Кеширане на изхода, зареждане на страницата и обратно изпращане - изглежда има две версии на кешираната страница

Научавам за кеширането на изхода на 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).

И така, изглежда има две версии в кеша; един за прясно заредената страница и втори за резултата от първото щракване върху бутона? Какво се случва? Мога ли да го предотвратя (за експериментални цели)? Опитах се да настроя атрибута varyByControl на "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