2009-11-23 11 views
7

En supposant le code ci-dessous:rendu page ASPX lors de l'exécution de la base de données

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? 
    } 
} 

comment puis-je implémenter la méthode CreatePage instancier une page basée sur la teneur en chaîne simple de ASPX?

La note est que la chaîne ASPX elle-même peut contenir référence à MasterPage existant sur le disque. Je me rends compte qu'il doit y avoir un énorme problème de performance avec cela, mais à ce stade, je veux juste savoir comment je peux le faire. Évidemment, je vais devoir mettre en cache le résultat.

Merci.

+0

Dans l'attente de la réponse. Ce serait incroyable si c'est possible. Bonne question. –

+0

L'entrée de Gonzalo et Rex ci-dessous est exacte, mais sachez que l'implémentation d'une nouvelle sous-classe VirtualPathProvider requiert des autorisations de confiance complètes (ou a été faite à un moment donné) et peut ne pas être exécutable dans un environnement d'hébergement partagé. – Chris

+0

Oui. La confiance totale est une grosse limitation. Une solution avec une confiance moyenne serait bien sûr préférable, si cela existe. –

Répondre

9

Le chemin que vous essayez de descendre est essentiellement chargement des fichiers ASPX à partir d'un autre mécanisme de stockage que le système de fichiers du serveur Web. Vous avez commencé à implémenter une partie de cela, mais vous n'avez même pas besoin d'un HttpHandler personnalisé pour le faire - ASP.NET a un mécanisme existant pour spécifier d'autres sources du balisage ASPX réel. Il s'agit d'un VirtualPathProvider, qui vous permet d'échanger les fonctionnalités par défaut pour charger les fichiers à partir du disque, par exemple en les chargeant à partir de SQL Server ou à tout autre endroit. Vous pouvez ensuite tirer parti de la compilation et de la mise en cache intégrées qu'ASP.NET utilise seul.

Le noyau de la fonctionnalité vient dans le GetFile method et 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); 
    } 
} 

Notez que aujourd'hui, en utilisant un VirtualPathProvider de mesure ne nécessite une confiance totale. Cependant, ASP.NET 4.0 sera bientôt disponible et il prend en charge les VPP de confiance moyenne.

+0

Ça a l'air très bien! Merci. J'ai trouvé un exemple pour ASP.NET MVC ici: http://padcom13.blogspot.com/2009/04/virtualpathprovider-example.html –

+0

Disons que la page ASPX a besoin d'un assembly qui contient le code derrière. Que pouvons-nous faire alors? – Mark