У меня есть некоторый код, который используется для замены вывода определенной страницы другим текстом.Я делаю это, устанавливая Response.Filter в Stream, сбрасывая ответ, а затем считывая этот Stream обратно в строку.Оттуда я могу манипулировать строкой и выводить полученный код.Вы можете увидеть базовый код для этого в Визуализация представления в виде строки .
Однако я заметил, что кэширование страниц больше не работает после первого вызова Response.Flush.
В качестве примера я собрал простое ASP.NET WebApp.У меня есть 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();
}