Подтвердить что ты не робот

Замена пост-кэша с переопределением Page.Render

Контекст

У меня есть веб-приложение Asp.Net с некоторыми страницами, которые наследуются от базового класса "BasePage". Этот класс BasePage наследуется от System.Web.ui.Page, и я переопределяю метод Render, чтобы перехватить поток HTML до его отправки в клиентский браузер.

Вот код моего метода Render:

protected override void Render(HtmlTextWriter writer){

    MemoryStream memoryStream = new MemoryStream();

    try
    {
        using (StreamWriter streamWriter = new StreamWriter(memoryStream))
        {
            var textWriter = new HtmlTextWriter(streamWriter);
            base.Render(textWriter);
            textWriter.Flush();
            memoryStream.Position = 0;

            using (StreamReader reader = new StreamReader(memoryStream))
            {
                string finalHtml = reader.ReadToEnd();

                // Processing filters
                finalHtml = FilterManager.ProcessFilters(finalHtml);

                // Writing output to client
                writer.Write(finalHtml);
                reader.Close();
            }
        }
    }
    catch(ObjectDisposedException)
    {

    }
    finally
    {
        memoryStream.Dispose();
    }
}

До сих пор так хорошо. Оно работает. Причина, по которой я не использовал функцию фильтрации ответов, заключается в том, что я знал it не будет совместим с заменой пост-кэша

Да. Я также хочу использовать подстановку outputcache. В целях тестирования я добавил небольшой asp.net-элемент управления на моей странице aspx:

<asp:Substitution runat="server" id="UnCachedArea" methodname="GetFreshDateTime" />

с соответствующим статическим методом int код:

protected static string GetFreshDateTime(HttpContext context)
{
    return DateTime.Now.ToString();
} 

... и... это работает!! У меня есть оба фильтра, работающие только при загрузке первой страницы, и замена для каждого обновления, которое я делаю на странице.

Проблема

Строка замещения вставлена ​​не в том месте, сразу после тега открытия тега, тогда как мой элемент управления susbtitution находится в самой нижней части страницы, в нижнем колонтитуле.

Любые подсказки?

4b9b3361

Ответ 1

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

Обычно с кеш-кэшем кэшированный вывод рендеринга выходит из динамических маркеров области в кэшированном ответе для блоков замещения, которые заполняются после кэша. При написании строки непосредственно в HtmlTextWriter вы нарушили способность ASP.NET делать это. Это по той же причине, почему вы не можете использовать ResponseFilters.

Скотт Гу имеет хорошее статью по этому вопросу