OutputCache的VaryByParam似乎不起作用

时间:2012-05-09 14:16:37

标签: asp.net caching

这是我创建的示例演示,试图解释自己有关OutputCache的VaryByParam属性:

标记:

<%@ 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的页面。但是当我点击第三个按钮时,它会缓存ABCD = 3的页面。 我期待的是页面不应该被缓存为ABCD = 3,因为我还没有在VaryByParam中指定它。当我反复点击第三个按钮时,我得到相同的dateTime。

编辑开始: 我也是这样试过的:

标记:

<%@ 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。我在这里遇到的一些奇怪的行为。

编辑结束

请详细说明我在做什么? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

您是否在OutputCache页面中放置了Default.aspx指令?从我看到你从具有Default.aspx指令的页面后期支持到OutputCaching ....

  

PostBackUrl

     

当前页面发布到的网页的URL   单击按钮控件。默认值为空字符串(“”),   这导致页面回发给自己。

修改

我尝试了相同的方案,但得到了相同的结果。无论我点击第三个按钮多少次,该页面仍然被缓存。我查看了Firebug,我可以在第一次点击后看到这些信息:

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

然后在连续点击后max-age减少。仅当max-age达到0时,才会再次从服务器请求页面。这是预期的行为。

问题是:第3个按钮正在传递一个不同的参数(ABCD),当页面不应该被缓存时,因为OutputCache指令指定了不同的参数(ID):

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

所以,我也想知道为什么会发生这种情况......因为第3个按钮传递了一个不同的参数(ABCD),所以它不应该缓存页面(根据我对MSDN文档的理解)。也许我们误解了这一切。

答案 1 :(得分:0)

使用VaryByParam =&#34; ID&#34;这就是OutputCache的工作原理。 - 它为每个具有不同密钥ID值的请求执行单独的缓存版本。如果用户执行了不使用ID的请求,则将创建新的缓存版本。 例如:

  1. home / index / ID = 1 - &gt;版本1
  2. home / index / ID = 2 - &gt;第2版​​
  3. home / index / ID = 1 - &gt;版本1 /重用ID = 1 /
  4. 的缓存版本
  5. home / index / - &gt;第3版
  6. home / index / Name = Peter - &gt;版本3 /重用缓存版本3 /
  7. home / index / Name = Peter&amp; ID = 2 - &gt;版本2 /重用版本2,因为使用ID = 2 /
  8. 因此,我们可以得出的结论是,如果执行 VaryByParam = ID ,那么新版本将用于我们与该参数一起使用的每个值。如果我们不在请求中使用该param,将创建一个单独的缓存版本,并将在下一个请求中重用。