【问题标题】:Output caching a custom control (server control)输出缓存自定义控件(服务器控件)
【发布时间】:2011-04-13 18:02:02
【问题描述】:

我遇到过有关缓存服务器控件的输出的提示,但尚未找到明确的答案:可以缓存服务器控件的输出(与缓存用户控件的方式相同)吗?

我遇到的建议涉及缓存数据(不是真正的输出缓存),或者建议设置 response.cache 选项。理想情况下,我希望能够将服务器控件拖到页面上并设置与 outputcache 指令同名的属性:

例子:

<cc1:MyCustomControl ID="ctl1" runat="server" CacheDuration="200" VaryByCustom="user" />

我打算深入研究框架以了解输出缓存的实际工作原理,但希望能找到一些信息来帮助我入门。根据我有限的理解,解析器决定是否缓存页面/用户控件。由于不解析服务器控件,因此无法阻止代码执行。我想我可以初始化一个“IsInCache”布尔值,并确保所有方法在执行代码之前检查该变量。这不会完全消除服务器控件的执行,但可以通过避免调用数据库并将数据绑定到控件来充分提高性能。

我仍在使用 .NET 3.5,并且没有太多时间探索 .NET 4.0 中的 OutputCache 提供程序模型。也许最新版的框架有解决方案?

有什么想法吗?

【问题讨论】:

    标签: asp.net controls outputcache


    【解决方案1】:

    我也在寻找这个,我想我应该将解决方案添加到这个页面,因为它出现在我的网络搜索中。有一个名为PartialCaching 的属性应用于服务器端/自定义控件,以达到与 ascx 和 aspx 模板中使用的OutputCache 指令相同的效果。它也采用相同的参数(VaryByParameter 等)。例如:

    [PartialCaching(1000, "foo", null, null)]
    public class ClientScriptVariableBlock : Control {
      ...
    }
    

    ASP 管道将此视为模板属性,因此最终结果是相同的。这很有价值(就我而言),因为我可以在 Web 项目本身之外创建可以缓存的通用服务器控件。 ASCX 模板在外部程序集中不能很好地工作:)

    【讨论】:

    • 谢谢!我一定会检查出来的。我当前的解决方案涉及对 .NET 控件进行子类化并覆盖每个“On...”子,以便不会为我使用缓存参数指定的任何控件引发事件。我使用基于“VaryBy ...”选项、CacheDuration 等的键以编程方式将控件添加到缓存中。它的工作原理就像一个魅力,但我不喜欢我不得不踩踏正常的控件生命周期去实现它。
    • 乍一看似乎无法更改 PartialCachingAttribute 中定义的值。如果它与用户控制 OutputCache 指令的工作方式相同,PageParser 会读取属性,因此无法将任何可变数据注入进程。
    • 不,我不认为有办法做到这一点。
    猜你喜欢
    • 2014-12-20
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多