1

这是我创建的示例演示,用于尝试解释 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。我在这里遇到了某种奇怪的行为。

编辑结束

请阐明我做错了什么?提前致谢。

4

2 回答 2

0

您是否OutputCache在页面中放置了指令Default.aspx?从我看到的内容来看,您正在Default.aspx从具有该OutputCaching指令的页面进行后支持....

PostBackUrl

单击 Button 控件时要从当前页面发布到的网页的 URL。默认值为空字符串 (""),它会导致页面回发到自身。

编辑:

我尝试了相同的场景,得到了相同的结果。无论我点击第三个按钮多少次,页面仍然被缓存。我查看了 Firebug,第一次单击后可以看到以下信息:

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

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

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

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

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

于 2012-05-09T14:46:29.417 回答
0

这就是使用 VaryByParam = "ID" 时 OutputCache 的工作方式 - 它为每个请求使用不同的键 ID 值执行单独的缓存版本。如果用户发出不使用 ID 的请求 - 将创建一个新的缓存版本。例子:

  1. home/index/ID=1 -> 版本 1
  2. home/index/ID=2 -> 版本 2
  3. home/index/ID=1 -> Version 1 /reusing cache version for ID=1/
  4. 主页/索引/ -> 版本 3
  5. home/index/Name=Peter -> 版本 3 /重用缓存版本 3/
  6. home/index/Name=Peter&ID=2 -> 版本 2 /reusing Version 2 因为使用 ID=2/

因此,我们可以得出的结论是,如果执行VaryByParam=ID,那么新版本将用于我们与该参数一起使用的每个值。如果我们不在请求中使用该参数,则会创建一个单独的缓存版本,并将在下一个请求中重用。

于 2017-07-01T19:22:07.013 回答