2012-05-09 2 views
1

Это пример демо, который я создал, чтобы попытаться объяснить себе об атрибуте VaryByParam из OutputCache:OutputCache, чтобы работать

разметке:

<%@ OutputCache Duration="10" VaryByParam="ID" %> 

<asp:Button ID="SetQueryStringButton1" runat="server" 
       Text="Set query string ID=1 and redirect" 
       PostBackUrl="~/OutputCachingUsingQueryString/Default.aspx?ID=1" /> 
    <br /> 
    <asp:Button ID="SetQueryStringButton2" runat="server" 
       Text="Set query string ID=2 and redirect" 
       PostBackUrl="~/OutputCachingUsingQueryString/Default.aspx?ID=2" /> 
    <br /> 
    <asp:Button ID="SetQueryStringButton3" runat="server" 
       Text="Set different query string and redirect" 
       PostBackUrl="~/OutputCachingUsingQueryString/Default.aspx?ABCD=3" /> 

Кодекс-за:

if (IsPostBack) 
    { 
     string key = Request.QueryString.GetKey(0); 
     MessageLabel.Text = "The value of query string " + key + " is : " + Request.QueryString[key] + "<br/>"; 
     MessageLabel.Text += DateTime.Now.ToLongTimeString(); 
    } 

когда я нажимаю первые две кнопки, а затем в соответствии с определением VaryByParam, он кэширует страницу для ID = 1 и ID = 2. Но когда я нажимаю на третью кнопку, она делает ча che page для ABCD = 3. Я ожидал, что страница не должна кэшироваться для ABCD = 3, потому что я не указал ее в VaryByParam. Я получаю тот же dateTime, когда я повторно нажимаю на третью кнопку.

EDIT START: Я также попытался это так:

разметке:

<%@ OutputCache Duration="10" VaryByParam="ID" %> 
<asp:Label ID="MessageLabel" runat="server"/><br/> 
<a href="Default.aspx?ID=1">Click Me and pass ID=1</a><br/> 
<a href="Default.aspx?ID=2">Click Me and pass ID=2</a><br/> 
<a href="Default.aspx?ABCD=3">Click Me and pass ABCD=3</a><br/> 

Кодекс-за:

if (!IsPostBack) 
{ 
    if (Request.QueryString.Keys.Count > 0) 
    { 
     string key = Request.QueryString.GetKey(0); 
     MessageLabel.Text = "The value of query string: " + key + " is: " + Request.QueryString[key] + "<br/>"; 
     MessageLabel.Text += DateTime.Now.ToString(); 
    } 
} 

Когда я нажимаю третий, он отображает MessageLabel после того, как я нажму пару раз. Какое-то странное поведение, которое я испытываю здесь.

EDIT END

Пожалуйста, пролить некоторый свет на то, что не так я делаю? Спасибо заранее.

+0

Комментарии от кого-нибудь? –

ответ

0

Вы разместили директиву OutputCache на своей странице Default.aspx? Из того, что я вижу, что ты пост-поддержку для Default.aspx со страницы, которая имеет OutputCaching директиву ....

PostBackUrl:

URL-адрес веб-страницы для отправки сообщений с текущей страницы, когда Нажмите кнопку управления кнопкой. Значение по умолчанию - это пустая строка (""), , которая заставляет страницу отправлять сообщения назад.

EDIT:

Я попробовал тот же сценарий, и я получил тот же результат. Независимо от того, сколько раз я нажал на третью кнопку, страница все еще была кеширована. Я посмотрел в Firebug, и я могу видеть эту информацию после того, как 1-клика:

Response Headersview 
Cache-Control public, max-age=10 

Затем после последовательных щелчков уменьшается максимальный возраст. Только когда max-age достигает 0, страница снова запрашивается с сервера. Это ожидаемое поведение.

Вещь: кнопка третья проходит другой из параметров (ABCD) и страница продолжает быть в кэше, когда он не должен, потому что OutputCache директива указывает другой из параметров (ID):

<%@ OutputCache Duration="10" VaryByParam="ID" %> 

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

+0

Да Leniel, все, что я написал, находится в Default.aspx. Можете ли вы попробовать эту демонстрацию на вашей стороне? Я понял вашу точку зрения, цель PostBackUrl - сделать перекрестную публикацию, но я также попытался сделать то же самое, но все равно не повезло. Вот почему я делаю все внутри Default.aspx. –

+0

Leniel, я отредактировал мой вопрос. Можете ли вы взглянуть на него? –

+0

Я тестирую это. Я скоро вернусь к вам ... –

0

Вот как работает OutputCache при использовании VaryByParam = "ID" - для каждого запроса используется отдельная версия кеша с разным значением для идентификатора ключа. Если пользователь выполняет запрос, который не использует идентификатор, будет создана новая версия кэширования. Пример:

  1. главная/индекс/ID = 1 -> Версия 1
  2. главная/индекс/ID = 2 -> Версия 2
  3. главная/индекс/ID = 1 -> Версия 1/повторное использование версия кэша для ID = 1/
  4. дом/индекс/-> версия 3
  5. дом/индекс/Name = Питер -> версия 3/повторное использование версии кэша 3/
  6. дом/индекс/Name = Peter & ID = 2 -> Версия 2/повторное использование версии 2, потому что с использованием ID = 2/

Таким образом, мы можем заключить, что если вы делаете VaryByParam = ID, то для каждого значения, которое мы используем с этим параметром, будет использоваться новая версия. Если мы не будем использовать этот параметр в запросе, будет создана отдельная версия кеша и будет использоваться повторно в следующих запросах.