首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式控制输出缓存-根据参数值禁用或启用缓存

以编程方式控制输出缓存-根据参数值禁用或启用缓存
EN

Stack Overflow用户
提问于 2009-06-25 10:22:23
回答 5查看 11.5K关注 0票数 20

我们有一个相当标准的电子商务场景,在类别中有分页的产品列表。不管是好是坏,大约80%的访问者从未浏览过第一页,根据类别的不同,可能会多出5-10页的结果,而这些页面的浏览率要低得多。(是的,我们确实优化了显示在第一页上的内容,并进行了良好的搜索-但这是另一种讨论)

我们不能缓存结果的每一页,因为我们受到内存的限制,但只缓存每个类别的第一页结果的好处将是巨大的。

我知道我可以使用对象缓存来存储有问题的数据集,但是是否可以使用输出缓存,比如使用response.Cache对象?

在页面生命周期的哪个阶段可以做到这一点呢?预渲染?

非常简单,网址类似于"/ProductList?Category=something&Page=1“,我希望逻辑类似于(伪代码):

代码语言:javascript
复制
If paramater "Page" equals 1
   Use output caching: vary by param = "categoryName; page"
else
   Don't use caching at all, just render the page from scratch.

我们使用的是IIS6/Win2003上的ASP.NET 2.0。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-31 15:21:23

您可以通过编程方式完成相同的操作,而不是使用OutputCache指令,如下所示:

代码语言:javascript
复制
if (yourArbitraryCondition) {
  OutputCacheParameters outputCacheSettings = new OutputCacheParameters();
  outputCacheSettings.Duration = 60;
  InitOutputCache(outputCacheSettings);
}

在OnInit中这样做应该可以很好地工作。显然,您可以通过设置OutputCacheParameter上的各种属性来调整缓存行为,它具有与指令相同的旋钮(实际上,这就是我们在使用指令时生成的)。

关键的一点是,您只能有条件地执行此逻辑,而指令使其成为无条件的。

更新:

作为另一种选择,您可以使用构建上述代码的低级缓存API。例如:

代码语言:javascript
复制
HttpCachePolicy cache = Response.Cache;
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(Context.Timestamp.AddSeconds(60));
cache.VaryByParams["categoryName"] = true;

基本上,这是做同样事情的另一种方式,没有使用任何标记为“不应该被调用”的API。最后,这两种方法都会起作用,所以你自己选吧。

票数 31
EN

Stack Overflow用户

发布于 2009-12-31 06:21:24

我更喜欢David Ebbo的答案,而不是我自己的。

你可以使用

代码语言:javascript
复制
<%@ OutputCache Duration="60"  VaryByParam="none" VaryByCustom="pageOne" %>

并以返回第一页的固定密钥和所有其他页的随机密钥的方式实现它。您可以(也应该)让scavenging机制管理内存,但如果需要,您可以使用HttpResponse.RemoveOutputCacheItem删除缓存项。

代码语言:javascript
复制
public override string GetVaryByCustomString(HttpContext ctx, string custom)
{
    if(custom == "pageOne")
    {
        if(ctx.Request["page"] == "1")
        {
            return "1";
        }

        HttpResponse.RemoveOutputCacheItem("/Default.aspx");
        return Guid.NewGuid().ToString();
    }
    return base.GetVaryByCustomString(ctx, custom);
}
票数 5
EN

Stack Overflow用户

发布于 2012-05-18 04:00:15

我认为最好的方法是使用HttpCachePolicy.AddValidationCallback

参见http://www.hanselman.com/blog/AdvancedASPNETCachingAndAddValidationCallBack.aspx -有一个完整的例子可以准确地回答这个问题。

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

https://stackoverflow.com/questions/1043112

复制
相关文章

相似问题

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