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

Mic*_*ker 1 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明显不同.如果模板识别不同的URL并忽略缓存,那将是很好的.我假设问题在于这两个页面都是在后端使用相同的aspx页面构建的.这是aspx页面中的OutputCache位:

<%@ OutputCache Duration="86400" Location="Server" VaryByParam="person_id; section" VaryByCustom="CMSPosting" VaryByHeader="Referer" %>
Run Code Online (Sandbox Code Playgroud)

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

dan*_*shr 5

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

尝试使用此输出缓存指令

<%@ OutputCache Location="Server" VaryByCustom="url" Duration="60" VaryByParam="*" %>
Run Code Online (Sandbox Code Playgroud)

然后将其添加到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
}
Run Code Online (Sandbox Code Playgroud)

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

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