У меня есть код, который используется для замены определенного вывода страницы другим текстом. Способ, которым я выполняю это, - установить Response.Filter в Stream, Flushing Response, а затем прочитать этот поток обратно в строку. Оттуда я могу манипулировать строкой и выводить полученный код. Вы можете увидеть базовый код для этого на Render a view as a string.Response.Flush break Page Кэширование
Однако я заметил, что кеширование страниц больше не работает после первого вызова Response.Flush.
В качестве примера я собрал простой ASP.NET WebApp. У меня есть Default.aspx с параметром @OutputCache, установленным на 30 секунд. Все это выводит DateTime.Now.ToLongTimeString(). Я переопределяю Render. Если я выполняю 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();
}
Code-за (Страница еще не кэшируется):
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
Response.Cache.SetCacheability(HttpCacheability.Server);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(30));
Response.Flush();
}
изменить: Я обновил заголовок, чтобы описать проблему – hackerhasid
Это отличный вопрос. Копая через отражатель, я не вижу никаких очевидных связей с промывкой и кешированием .... хочу, чтобы я мог потратить больше времени на это прямо сейчас. – womp