Asp.net 使用Page.Render重写进行缓存后替换 上下文

Asp.net 使用Page.Render重写进行缓存后替换 上下文,asp.net,outputcache,substitution,Asp.net,Outputcache,Substitution,我有一个Asp.NETWeb应用程序,其中一些页面继承自基类“BasePage”。 这个BasePage类继承自System.Web.ui.Page,我已经重写了Render方法,以便在将HTML流发送到客户端浏览器之前拦截它 以下是我的渲染方法的代码: protected override void Render(HtmlTextWriter writer){ MemoryStream memoryStream = new MemoryStream(); try {

我有一个Asp.NETWeb应用程序,其中一些页面继承自基类“BasePage”。 这个BasePage类继承自System.Web.ui.Page,我已经重写了Render方法,以便在将HTML流发送到客户端浏览器之前拦截它

以下是我的渲染方法的代码:

protected override void Render(HtmlTextWriter writer){

    MemoryStream memoryStream = new MemoryStream();

    try
    {
        using (StreamWriter streamWriter = new StreamWriter(memoryStream))
        {
            var textWriter = new HtmlTextWriter(streamWriter);
            base.Render(textWriter);
            textWriter.Flush();
            memoryStream.Position = 0;

            using (StreamReader reader = new StreamReader(memoryStream))
            {
                string finalHtml = reader.ReadToEnd();

                // Processing filters
                finalHtml = FilterManager.ProcessFilters(finalHtml);

                // Writing output to client
                writer.Write(finalHtml);
                reader.Close();
            }
        }
    }
    catch(ObjectDisposedException)
    {

    }
    finally
    {
        memoryStream.Dispose();
    }
}
到目前为止,一切顺利。它起作用了。我没有使用的原因是我知道

对。我还想使用outputcache替换。出于测试目的,我在我的aspx页面中添加了一个小型asp.net控件:

<asp:Substitution runat="server" id="UnCachedArea" methodname="GetFreshDateTime" />
。。。而且。。。它起作用了!!我的过滤器只在第一个页面加载时工作,并且每次刷新页面时都会进行替换

问题 替换字符串插入到错误的位置,就在开始正文标记之后,而我的替换控件位于页面底部的页脚中


有什么线索吗?

这是因为您修改了渲染以将输出平坦化为单个字符串,这就是缓存的内容

通常,对于圆环缓存,缓存的渲染输出会在缓存响应中为缓存后填充的替换块留下动态区域标记。在将字符串直接写入HtmlTextWriter时,您已经破坏了ASP.NET执行此操作的能力。这与不能使用ResponseFilter的原因相同


Scott Gu在这方面做得很好

我们这里也有同样的问题。。。我开始悬赏。我希望一个好的灵魂会帮助我们。如果你拿出自定义渲染,它工作正常吗?因此,如果我理解,答案是:不可能使用带有替换和渲染后过滤的outputcaching(无论我们使用何种方法),而且没有任何可能的技巧可以做到这一点,因为这是asp.net outputcache概念所固有的。如果您将内容作为字符串写入
HtmlTextWriter
,那么就没有了。根据您对过滤器的操作,可能还有其他方法。控制适配器有帮助吗?或者在主内容渲染之外的特定控件中进行更细粒度的过滤?好的。不管怎么说,我已经放弃了解决这个问题,因为我目前的工作重点和找到解决方法所能带来的好处都很小。。。谢谢你的精密度
protected static string GetFreshDateTime(HttpContext context)
{
    return DateTime.Now.ToString();
}