Question

En supposant le code ci-dessous:

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 mettre en œuvre CreatePage méthode pour instancier une page basée sur la teneur en chaîne simple de ASPX?

La note est que la chaîne elle-même peut ASPX référence à MasterPage contiennent déjà existant sur le disque.

Je me rends compte qu'il doit y avoir énorme problème de performance avec cela, mais à ce stade, je veux juste savoir comment je peux le faire. Il est évident que je vais devoir mettre en cache le résultat.

Merci.

Était-ce utile?

La solution

Le chemin que vous essayez d'aller vers le bas est essentiellement chargement de fichiers ASPX à partir d'un autre mécanisme de stockage que le système de fichiers du serveur Web . Vous avez commencé à mettre en œuvre une partie de cela, mais vous ne fait même pas besoin d'une coutume HttpHandler de le faire -. ASP.NET a un mécanisme existant pour spécifier d'autres sources du balisage ASPX réelle

Il est appelé VirtualPathProvider , et il vous permet d'échanger la fonctionnalité par défaut pour le chargement des fichiers à partir du disque avec, par exemple, de les charger à partir de SQL Server ou partout ailleurs logique. Ensuite, vous pouvez profiter de toutes les compilation intégrée et la mise en cache que ASP.NET utilise lui-même.

Le noyau de la fonctionnalité se présente sous la méthode GetFile et VirtualFile de (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 personnalisé ne nécessite une confiance totale. Cependant, bientôt ASP.NET 4.0 sera disponible et il prend en charge VPP en confiance moyenne.

Autres conseils

Une façon de le faire est de créer une sous-classe de VirtualPathProvider et le définir comme HostingEnvironment.VirtualPathProvider en appelant HostingEnvironment.RegisterVirtualPathProvider . Vous devrez passer outre quelques méthodes. L'être le plus important GetFile (). Le système de construction se chargera de la mise en cache.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top