Domanda

  

Eventuali duplicati:
   Un modo per aggiungere HttpHandler programmazione in .NET?

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

Questo può sembrare folle, ma ho buone ragioni per fare questo. Sto costruendo una WidgetLibrary che un proprietario di sito web può utilizzare semplicemente facendo cadere un file DLL nella loro directory bin, e vogliono sostenere questo con il minimo di configurazione per il web.config.

È stato utile?

Soluzione

Non credo che sia possibile modificare la sede gestori HTTP una volta che il dominio di applicazione è in esecuzione in quanto i gestori disponibili vengono letti direttamente dal file web.config poi nella cache in una struttura di dati privati.

Se si sapeva in anticipo che le estensioni si voleva consentire, si potrebbe fare è mappare queste estensioni per un singolo HttpHandlerFactory e quindi restituire un gestore di vostra scelta (utilizzando carico montaggio dinamico e di riflessione). Ad esempio:

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

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

Altri suggerimenti

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

  1. Se la sua WebForms un'applicazione quindi garantire la vostra webapp ha la configurazione UrlRouting nel web.config (Yip pause parte del vostro requisito iniziale per avere minime modifiche al web.config), come spiegato da MS qui: Usa Routing con Web Forms
  2. Implementare l'interfaccia IRouteHandler sul tuo gestore e restituire la curva in seguito nei suoi metodi (vedi primo esempio di seguito)
  3. Registrare il percorso (vedi secondo esempio qui sotto)

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

Registra Percorso:

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

Il gioco è fatto. Una curva registrata però codice. :)

Quando si crea un controllo, di solito ignorare la funzione GetDesignTimeHtml nella mia classe ControlDesigner. Da quella funzione verifico se la HttpHandler è registrato, e se no, mi registro esso. 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à di azione è una statica HttpHandlerAction

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top