为什么页面在一个URL上使用来自另一个URL的缓存页面?

时间:2010-12-01 22:05:49

标签: asp.net caching outputcache

背景

我是ASP.NET的新手,对缓存的概念也很陌生。我希望对于那些知道自己正在做的人来说,这里的问题显而易见。

使用MCMS 2002,我构建了一个template.aspx页面,该页面接收“person_id”查询字符串并相应地构建页面。我工作的学校的几个不同部门正在使用这个模板来展示教师的传记。这一切都正常。

问题

当我尝试缓存页面时,问题就开始发生了。当一个人在一个部门的页面上访问person_id = 16175,然后访问不同部门页面上的相同数字生物,它会加载缓存页面而不是重建它。那么问题在于它拥有所有错误的部门品牌。例如:

http://health.usf.edu/medicine/obgyn/facstaf/profiles.htm?person_id=16175 http://health.usf.edu/medicine/surgery/surgery_bios.html?person_id=16175

它与person_id相同,但网址明显不同。如果模板识别不同的URL并忽略缓存,那将是很好的。我假设问题在于这两个页面都是在后端使用相同的aspx页面构建的。这是aspx页面中的OutputCache位:

<%@ OutputCache Duration="86400" Location="Server" VaryByParam="person_id; section" VaryByCustom="CMSPosting" VaryByHeader="Referer" %>

我想我在这里做错了什么。希望对于知道自己正在做的人来说,这是显而易见的。如果您需要更多信息,请不要犹豫。谢谢!

1 个答案:

答案 0 :(得分:5)

你很可能在你的假设中是正确的,因为他们使用相同的ASPX文件,我亲身经历过同样的事情。要解决此问题,请尝试以下操作。

尝试使用此输出缓存指令

<%@ OutputCache Location="Server" VaryByCustom="url" Duration="60" VaryByParam="*" %>

然后将其添加到Global.asax文件中。

public override string GetVaryByCustomString(HttpContext context,string arg)
{
    if (arg == "url")
    {
         return context.Request.RawUrl;
    }
    return context.Request.RawUrl;//you can vary by other stuff here
}

对于给定参数的方法返回的每个唯一值,将缓存页面版本。因此,通过返回URL,您可以确保不会为不同的URL命中缓存

需要注意的一件事是,如果您没有单个物理文件解析为多个网址,那么VaryByParam="*"就足以获得您想要的行为。这是因为您拥有所需的{URL}路由VaryByCustom="url"