Asp.net 响应。刷新破坏页面缓存

Asp.net 响应。刷新破坏页面缓存,asp.net,asp.net-mvc,caching,Asp.net,Asp.net Mvc,Caching,我有一些代码,用于用其他文本替换某些页面输出。实现这一点的方法是将Response.Filter设置为流,刷新响应,然后将该流读回字符串。从那里我可以操作字符串并输出结果代码。你可以在上看到这个的基本代码 但是,我注意到在第一次响应.Flush调用之后,页面缓存不再工作 我以一个简单的ASP.NET Web应用程序为例。我有一个Default.aspx,其中@OutputCache设置了30秒。这只需要输出DateTime.Now.ToLongTimeString()。我覆盖渲染。如果我执行Re

我有一些代码,用于用其他文本替换某些页面输出。实现这一点的方法是将Response.Filter设置为流,刷新响应,然后将该流读回字符串。从那里我可以操作字符串并输出结果代码。你可以在上看到这个的基本代码

但是,我注意到在第一次响应.Flush调用之后,页面缓存不再工作

我以一个简单的ASP.NET Web应用程序为例。我有一个Default.aspx,其中@OutputCache设置了30秒。这只需要输出DateTime.Now.ToLongTimeString()。我覆盖渲染。如果我执行Response.Flush(即使在base.Render之后),页面也不会被缓存。这与我设置的任何编程缓存能力无关

看来Response.Flush完全破坏了任何正在使用的页面缓存。为什么会这样

额外提示:是否有一种方法可以实现我想要的(将输出呈现为字符串)而不会导致忽略页面缓存

ASPX页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestCacheVsFlush._Default" %>
<%@ OutputCache Duration="30" VaryByParam="none" %>
<%= DateTime.Now.ToLongTimeString() %>
    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(writer);
    }
protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.Flush();
}
protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.Cache.SetCacheability(HttpCacheability.Server);
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(30));
    Response.Flush();
}
代码隐藏(页面未缓存):

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestCacheVsFlush._Default" %>
<%@ OutputCache Duration="30" VaryByParam="none" %>
<%= DateTime.Now.ToLongTimeString() %>
    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(writer);
    }
protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.Flush();
}
protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.Cache.SetCacheability(HttpCacheability.Server);
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(30));
    Response.Flush();
}
代码隐藏(页面仍未缓存):

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestCacheVsFlush._Default" %>
<%@ OutputCache Duration="30" VaryByParam="none" %>
<%= DateTime.Now.ToLongTimeString() %>
    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(writer);
    }
protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.Flush();
}
protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.Cache.SetCacheability(HttpCacheability.Server);
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(30));
    Response.Flush();
}

好吧,我想我有一个部分答案给你

发件人:

输出缓存模块填充 IHttpCachePolicy内在于 如果匹配,则开始请求阶段 已找到配置文件。其他模块可以 仍要更改服务器的缓存策略 可能更改的当前请求 用户模式或内核模式缓存 行为。输出缓存200 仅获取请求的响应如果 某些模块已经刷新了 请求到达时的响应 UpdateRequestCache阶段或if标头 被抑制时,响应不会被缓存 在输出缓存模块中

那篇文章是针对IIS7的,所以不确定这篇文章是如何翻译成其他版本的,但可能是类似的
UpdateRequestCache
是其中之一,它发生在IHttpHandler(例如,您的页面对象)完成处理请求后


所以。。。在页面内执行刷新看起来不太好。

edit:我更新了标题以更能描述问题这是一个很好的问题。通过反射器挖掘,我没有发现任何与刷新和缓存的明显联系。。。。希望我现在能花更多的时间在上面。仅供参考,这也发生在IIS6中。