Контекст
У меня есть веб-приложение 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 находится в самой нижней части страницы, в нижнем колонтитуле.
Любые подсказки?