2010-03-23 10 views
12

Eventuali duplicati:
Any way to add HttpHandler programatically in .NET?ASP.NET - dinamicamente registrare un HttpHandler nel codice (non in web.config)

C'è un modo per registrare in modo dinamico un IHttpHandler in C# codice, invece di doverlo aggiungere manualmente alla sezione system.web/httpHandlers nel web.config.

Questo può sembrare pazzesco, ma ho buone ragioni per farlo. Sto costruendo una WidgetLibrary che il proprietario di un sito Web può utilizzare semplicemente rilasciando un file .dll nella loro directory bin e voglio supportarlo con una configurazione minima su web.config.

+1

Questa domanda è una copia e le risposte sembrano essere imprecise. –

risposta

8

Non credo sia possibile modificare HttpHandlers registrati una volta che l'AppDomain è in esecuzione perché i gestori disponibili vengono letti direttamente dal file web.config quindi memorizzati nella cache in una struttura dati privata.

Se sapevi in ​​anticipo quali estensioni si desidera consentire, è possibile eseguire il mapping di queste estensioni su un singolo HttpHandlerFactory e quindi restituire un gestore di propria scelta (utilizzando il caricamento e il riflesso dell'assieme dinamico). Per esempio:

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

Modifica del web.config in fase di esecuzione causerebbe il dominio di applicazione per riavviare.

2

Durante la creazione di un controllo, di solito sovrascrivo la funzione GetDesignTimeHtml nella mia classe ControlDesigner. Da quella funzione controllo se HttpHandler è registrato e, in caso contrario, lo registro. Ecco il codice che uso per registrare il nuovo 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 proprietà Action è un HttpHandlerAction statica

17

Non è possibile modificare i gestori, ma è possibile aggiungere un percorso per raggiungere la curva a programatically seguendo questi passaggi :

  1. Se la sua WebForms un'applicazione quindi assicurare il vostro webapp ha la configurazione UrlRouting nel web.config (Yip rompe parte del vostro requisito iniziale per avere minime modifiche al web.config), come spiegato da MS qui: Use Routing with Web Forms
  2. implementare l'interfaccia IRouteHandler sul conduttore e tornare la curva in seguito nei suoi metodi (vedi primo esempio qui sotto)
  3. Registrare il percorso (vedi secondo esempio qui sotto)

Implementare 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; 
    } 
} 

Registrati percorso:

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

Là ce l'hai. Un hander registrato tramite codice. :)

+0

Questo è lo stesso metodo di StackExchange.MiniProfiler registra il suo percorso e gestore per l'elemento di interfaccia utente di esso (è comunque necessario un ingresso gestore per esso) –

+1

Lavoro come un fascino! Grazie! –

+0

Ho provato a implementarlo ma il gestore non viene registrato. Dovrei aggiungere del codice al processo pubblico ProcessRequest (contesto HttpContext)? – SSED