2009-11-23 2 views
7

Предполагая, что код ниже:Рендер ASPX страницы во время выполнения из базы данных

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 на диске.

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

Спасибо.

+0

Ждем ответа. Было бы замечательно, если это возможно. Хороший вопрос. –

+0

Ввод из Gonzalo и Rex ниже является точным, но имейте в виду, что для реализации нового подкласса VirtualPathProvider требуются полные разрешения на доверительные отношения (или делаются в какой-то момент) и могут не выполняться в среде общего хостинга. – Chris

+0

Да. Полное доверие - большое ограничение. Разумеется, решение со средним доверием будет лучше, если таковое существует. –

ответ

9

Путь, который вы пытаетесь спуститься, по существу Загрузка ASPX-файлов из другого механизма хранения, чем файловая система веб-сервера. Вы начали реализовывать часть этого, но на самом деле вам даже не нужен пользовательский HttpHandler, чтобы сделать это - ASP.NET имеет существующий механизм для указания других источников фактической разметки ASPX.

Он называется VirtualPathProvider, и он позволяет вам поменять функциональность по умолчанию для загрузки файлов с диска, скажем, путем загрузки их с SQL Server или где-то еще имеет смысл. Затем вы можете использовать все встроенные компиляции и кэширования, которые ASP.NET использует самостоятельно.

Ядро функциональности приходит в GetFile method и VirtualFile's Open():

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 под средним доверием.

+0

Звучит очень хорошо! Благодарю. Я нашел образец для ASP.NET MVC здесь: http://padcom13.blogspot.com/2009/04/virtualpathprovider-example.html –

+0

Предположим, что для страницы aspx требуется сборка, содержащая код позади. Что мы можем сделать тогда? – Mark

1

Один из способов сделать это путем создания подкласса VirtualPathProvider и установить его как HostingEnvironment.VirtualPathProvider, вызвав HostingEnvironment.RegisterVirtualPathProvider. Вам придется переопределить несколько методов. Наиболее важным является GetFile(). Система сборки позаботится о кешировании.