Рендеринг страницы ASPX во время выполнения из базы данных
-
21-09-2019 - |
Вопрос
Предполагая код ниже:
public class DynamicAspxHandler : IHttpHandler {
bool IHttpHandler.IsReusable { get { return false; } }
void IHttpHandler.ProcessRequest(HttpContext httpContext) {
string aspxContent = PlainASPXContent();
Page page = CreatePage(httpContext, aspxContent);
page.ProcessRequest(httpContext);
}
Page CreatePage(HttpContext context, string aspxContent) {
// How to implement this?
}
}
как я могу реализовать CreatePage метод для создания экземпляра страницы на основе простого строкового содержимого ASPX?
Обратите внимание: сама строка ASPX может содержать ссылку на уже существующую MasterPage на диске.
Я понимаю, что здесь должны быть огромные проблемы с производительностью, но на данном этапе я просто хочу знать, как я могу это сделать.Очевидно, мне придется кэшировать результат.
Спасибо.
Решение
Путь, по которому вы пытаетесь идти, по сути загрузка файлов ASPX из какого-либо другого механизма хранения, кроме файловой системы веб-сервера.Вы начали реализовывать часть этого, но на самом деле для этого вам даже не нужен специальный HttpHandler — в ASP.NET существует существующий механизм для указания других источников фактической разметки ASPX.
Это называется Виртуалпаспровидер, и он позволяет вам заменить стандартную функциональность загрузки файлов с диска, скажем, на загрузку их с SQL Server или где-то еще, что имеет смысл.Тогда вы сможете воспользоваться всеми преимуществами встроенной компиляции и кэширования, которые ASP.NET использует самостоятельно.
Ядро функциональности заключено в Метод GetFile и Открытие виртуального файла():
public override VirtualFile GetFile(string virtualPath)
{
//lookup ASPX markup
return new MyVirtualFile(aspxMarkup);
}
//...
public class MyVirtualFile : VirtualFile
{
private string markup;
public MyVirtualFile(string markup)
{
this.markup = markup;
}
public override Stream Open()
{
return new StringReader(this.markup);
}
}
Обратите внимание, что сегодня использование специального VirtualPathProvider требует полного доверия.Однако скоро будет доступен ASP.NET 4.0, который поддерживает VPP со средним уровнем доверия.
Другие советы
Один из способов сделать это — создать подкласс Виртуалпаспровидер и установите его как HostingEnvironment.VirtualPathProvider, вызвав HostingEnvironment.RegisterVirtualPathProvider.Вам придется переопределить несколько методов.Самым важным из них является GetFile().Система сборки позаботится о кэшировании.