首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OutputCache的VaryByParam似乎不起作用

OutputCache的VaryByParam似乎不起作用
EN

Stack Overflow用户
提问于 2012-05-09 14:16:37
回答 2查看 1.3K关注 0票数 1

这是我创建的一个示例演示,试图解释一下关于VaryByParam属性的OutputCache:

标记:

代码语言:javascript
复制
<%@ 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" />

守则-幕后:

代码语言:javascript
复制
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。

编辑开始:我也尝试过这样做:

标记:

代码语言:javascript
复制
<%@ 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/>

守则-幕后:

代码语言:javascript
复制
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();
   }
}

当我单击第三个按钮时,它会在我点击它几次之后显示它。我在这里遇到的一些奇怪的行为。

编辑端

请弄清楚我做错了什么?提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-05-09 14:46:29

您是否将OutputCache指令放置在Default.aspx页面中?据我所见,您正在从具有OutputCaching指令的页面回发到OutputCaching.

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

编辑:

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

代码语言:javascript
复制
Response Headersview
Cache-Control   public, max-age=10

然后,在连续点击后,最大年龄减少。只有当最大年龄达到0时,才会再次从服务器请求页面.这是预期的行为。

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

代码语言:javascript
复制
<%@ OutputCache Duration="10" VaryByParam="ID" %>

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

票数 0
EN

Stack Overflow用户

发布于 2017-07-01 19:22:07

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

  1. home/index/ID=1 ->版本1
  2. home/index/ID=2 ->版本2
  3. home/index/ID=1 ->版本1 /reusing缓存版本的ID=1/
  4. home/index/ ->版本3
  5. home/index/Name=Peter ->版本3 /reusing缓存版本3/
  6. home/index/Name=Peter&ID=2 ->版本2 /reusing版本2,因为使用ID=2/

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10517967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档