2010-02-03 2 views
2

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

изменить: Я обновил заголовок, чтобы описать проблему – hackerhasid

+0

Это отличный вопрос. Копая через отражатель, я не вижу никаких очевидных связей с промывкой и кешированием .... хочу, чтобы я мог потратить больше времени на это прямо сейчас. – womp

ответ

3

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

От here:

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

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

Итак ...это не выглядит хорошо для выполнения флеша внутри вашей страницы.

+0

FYI, это происходит и в IIS6. – hackerhasid