Подстановка после кэширования с переопределением Page.Render - PullRequest
12 голосов
/ 08 июля 2011

Контекст

У меня есть веб-приложение 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();
    }
}

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

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

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

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

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

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

Проблема

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

Есть какие-нибудь подсказки?

1 Ответ

1 голос
/ 27 августа 2011

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

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

Скотт Гу имеет при себе статью по теме

...