我在输出缓存中遇到了一个奇怪的问题。我在一个页面上有多个用户控件,其中一个是登录控件。页面和登录控件未缓存,但其他用户控件使用 VaryByParam 进行缓存。现在,当我点击不同的页面时,所有这些都与缓存一起工作。但是一旦我登录,该页面上的其他用户控件就会显示旧的缓存版本。如果我刷新页面,我会得到所有用户控件的正确缓存版本。问题仅在回发发生时。出于某种原因,在回发时,返回的缓存版本没有考虑 VaryByParam 字符串。在网上搜索这个时,我确实在 asp.net 上看到了一个类似的问题,其中有一个解释这个问题的代码。
为什么回发会导致缓存返回无效版本?
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>
<!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>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<uc1:WebUserControl1 ID="WebUserControl11" runat="server" EnableViewState="false" />
</form>
</body>
</html>
WebUserControl1.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebApplication1.WebUserControl1" %>
<%@ OutputCache Duration="3600" VaryByParam="MenuID" %>
<asp:LinkButton ID="test" runat="server" Text="PostBack"></asp:LinkButton>
<br /><br />
<a href="Default.aspx?menuid=1">1</a> - <a href="Default.aspx?menuid=2">2</a> - <a href="Default.aspx?menuid=3">3</a>
<br /><br />
MenuID: <%= Request.QueryString["MenuID"] != null ? Request.QueryString["MenuID"].ToString() : "null" %>
运行演示,您将看到在页面之间单击会获得正确的缓存版本。但是尝试单击页面并导致回发,然后您会发现有时会收到错误的缓存版本。