2010-03-23 11 views
12

Duplicate possible:
Any way to add HttpHandler programatically in .NET?ASP.NET - Enregistrer dynamiquement HttpHandler dans le code (pas web.config)

Est-il possible que je peux enregistrer dynamiquement un IHttpHandler en C# code, au lieu de devoir l'ajouter manuellement à la section system.web/httpHandlers dans le fichier web.config.

Cela peut sembler fou, mais j'ai de bonnes raisons de le faire. Je construis une WidgetLibrary que le propriétaire d'un site Web peut utiliser simplement en déposant un fichier .dll dans son répertoire bin, et je veux le supporter avec une configuration minimale pour le web.config.

+1

Cette question est un double et les réponses semblent être erronées. –

Répondre

8

Je ne crois pas qu'il soit possible de modifier les HttpHandlers enregistrés une fois que AppDomain est en cours d'exécution car les gestionnaires disponibles sont lus directement à partir du fichier web.config puis mis en cache dans une structure de données privée.

Si vous saviez d'avance quelles extensions vous souhaitez autoriser, vous pouvez faire correspondre ces extensions à un seul HttpHandlerFactory puis renvoyer un gestionnaire de votre choix (en utilisant le chargement et la réflexion de l'assemblage dynamique). Par exemple:

<add path="*.ch1,*.ch2,*.ch3" verb="*" 
    type="MyHandlers.MyHandlerFactory, MyHandlers" /> 

Modification du web.config lors de l'exécution provoquerait l'AppDomain pour redémarrer.

2

Lors de la création d'un contrôle, je remplace généralement la fonction GetDesignTimeHtml dans ma classe ControlDesigner. De cette fonction je vérifie si le HttpHandler est enregistré, et sinon, je l'enregistre. Voici le code que j'utilise pour enregistrer le nouveau HttpHandler:

private void RegisterHttpHandler() 
    { 

     IWebApplication webApplication = 
      (IWebApplication)this.GetService(typeof(IWebApplication)); 

     if (webApplication != null) 
     { 
      Configuration configuration = webApplication.OpenWebConfiguration(false); 
      if (configuration != null) 
      { 
       HttpHandlersSection section = 
        (HttpHandlersSection)configuration.GetSection(
        "system.web/httpHandlers"); 
       if (section == null) 
       { 
        section = new HttpHandlersSection(); 
        ConfigurationSectionGroup group = 
         configuration.GetSectionGroup("system.web"); 
        if (group == null) 
        { 
         configuration.SectionGroups.Add("system.web", 
          new ConfigurationSectionGroup()); 
        } 
        group.Sections.Add("httpHandlers", section); 
       } 
       section.Handlers.Add(Action); 
       configuration.Save(ConfigurationSaveMode.Minimal); 
      } 
     } 

    } 

La propriété d'action est un HttpHandlerAction statique

17

Vous ne pouvez pas modifier les gestionnaires, mais vous pouvez ajouter un itinéraire à votre clapoteuses suivant programatically ces étapes :

  1. Si son une application WebForms puis vous assurer que votre webapp a la configuration UrlRouting dans le web.config (Yip casse partie de votre exigence initiale d'avoir un minimum de changements à web.config) comme expliqué par MS ici: Use Routing with Web Forms
  2. implémentent l'interface IRouteHandler sur votre gestionnaire et retourner le virage à la suite de ses méthodes (voir premier exemple ci-dessous)
  3. Inscrivez votre itinéraire (voir le deuxième exemple ci-dessous)

Mettre en œuvre IRouteHandler

public class myHandler : IHttpHandler, IRouteHandler 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     // your processing here 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return this; 
    } 
} 

Inscription Route:

//from global.asax.cs 
protected void Application_Start(object sender, EventArgs e) 
{ 
    RouteTable.Routes.Add(new Route 
    (
     "myHander.axd", 
     new myHandler() 
    )); 
} 

Voilà, vous l'avez. Un hander enregistré par le code. :)

+0

C'est la même méthode que StackExchange.MiniProfiler enregistre son itinéraire et son gestionnaire pour l'élément de l'interface utilisateur (vous avez toujours besoin d'une entrée de gestionnaire pour cela) –

+1

Travaillez comme un charme! Je vous remercie! –

+0

J'ai essayé de l'implémenter mais le gestionnaire n'est pas enregistré. Suis-je censé ajouter du code au processus public ProcessRequest (contexte HttpContext)? – SSED