【问题标题】:Post-cache substitution with Page.Render overriding使用 Page.Render 覆盖的缓存后替换
【发布时间】:2011-07-07 20:12:02
【问题描述】:

上下文

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

这是我的 Render 方法的代码:

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();
    }
}

到目前为止,一切都很好。有用。我没有使用response filtering feature的原因是我知道it wouldn't be compatible with Post-cache substitution

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

<asp:Substitution runat="server" id="UnCachedArea" methodname="GetFreshDateTime" />

在后面的代码中使用相应的静态方法:

protected static string GetFreshDateTime(HttpContext context)
{
    return DateTime.Now.ToString();
} 

...并且...它有效!我的过滤器只在第一个页面加载时起作用,并且在我在页面上进行的每次刷新时都会发生替换。

问题

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

有什么线索吗?

【问题讨论】:

  • 我们这里也有同样的问题...我开始了赏金。我希望一个好的灵魂能帮助我们。
  • 如果你去掉自定义渲染它工作正常吗?

标签: asp.net outputcache substitution


【解决方案1】:

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

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

Scott Gu 在这个问题上很擅长article

【讨论】:

  • 所以如果我理解,答案是:不可能使用输出缓存和替换和渲染后过滤(不管我们使用什么方法),并且没有任何可能的技巧可以做到这一点因为它是 asp .net outputcache 概念所固有的?
  • 好吧,如果您将内容作为字符串写入HtmlTextWriter ,那么不会。根据您对过滤器的操作,可能还有其他方法。控制适配器会有帮助吗?还是在主要内容渲染之外的特定控件中进行更精细的过滤?
  • 好的。无论如何,我已经放弃了解决这个问题,因为我目前的优先事项以及我可以找到解决它的方法可以获得的一点好处......谢谢你所有的精确度
猜你喜欢
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多