Рендеринг страницы ASPX во время выполнения из базы данных

StackOverflow https://stackoverflow.com/questions/1781275

Вопрос

Предполагая код ниже:

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().Система сборки позаботится о кэшировании.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top