Response.Flush нарушает кэширование страниц - PullRequest
2 голосов
/ 03 февраля 2010

У меня есть некоторый код, который используется для замены вывода определенной страницы другим текстом.Я делаю это, устанавливая 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();
}

1 Ответ

3 голосов
/ 03 февраля 2010

Хорошо, я думаю, что у меня есть частичный ответ для вас.

С здесь :

Модуль выходного кэша заполняет IHttpCachePolicy свойственный в Стадия BeginRequest, если соответствие профиль найден. Другие модули могут все еще изменить политику кэширования для текущий запрос, который может измениться кэширование в режиме пользователя или в режиме ядра поведение. Кэш-память вывода 200 ответы только на запросы GET. Если какой-то модуль уже сменил ответ на запрос времени Этап UpdateRequestCache или, если заголовки подавлены, ответ не кэшируется в модуле вывода кеша .

Эта статья относится только к IIS7, поэтому не уверен, как она переводится на другие версии, но, вероятно, она похожа. UpdateRequestCache является одним из событий конвейера HttpApplication , и оно происходит после того, как IHttpHandler (например, ваш объект Page) завершил обработку запроса.

Итак ... это не очень хорошо для выполнения сброса внутри вашей Страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...