Frage

  

Mögliche Duplizieren:
   Jede Art und Weise Httphandler programatically in .NET hinzufügen?

Gibt es eine Möglichkeit, ich kann eine IHttpHandler in C # -Code dynamisch registrieren, anstatt zu manuell zu dem system.web/httpHandlers Abschnitt in der web.config hinzufügen.

Das mag verrückt klingen, aber ich habe gute Gründe, dies zu tun. Ich baue eine WidgetLibrary, dass der Betreiber einer Website eine DLL-Datei in ihrem Verzeichnis bin können nur durch Fallenlassen, und wollen diese mit minimaler Konfiguration in die web.config unterstützen.

War es hilfreich?

Lösung

Ich glaube nicht, es ist möglich, die registrierte Httphandlers einmal die AppDomain zu modifizieren ausgeführt wird, da die verfügbaren Handler direkt aus der web.config Datei gelesen wird dann in einer privaten Datenstruktur zwischengespeichert werden.

Wenn Sie im Voraus wusste, welche Erweiterungen, damit Sie wollten, könnten Sie tun, ist diese Erweiterungen zu einem einzigen HttpHandlerFactory Karte und dann einen Handler Ihrer Wahl zurückzukehren (durch Verwendung dynamischer Montage Laden und Reflexion). Zum Beispiel:

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

die web.config zur Laufzeit ändern würde bewirken, dass die AppDomain neu zu starten.

Andere Tipps

Sie können nicht die Handler ändern, aber Sie können auf diesen Schritten folgt einer Route zu Ihrem Hander programmatisch hinzufügen:

  1. Wenn sie ein WebForms App dann Webapp sicherzustellen, hat die UrlRouting Konfiguration in der web.config (Yip Pausen Teil Ihrer ursprünglichen Anforderung zu web.config minimalen Änderungen haben), wie hier von MS erklärt: Verwenden Sie Routing mit Web Forms
  2. Implementieren Sie die IRouteHandler-Schnittstelle auf Ihrem Handler und gibt die Hander als das Ergebnis in ihren Methoden (siehe erstes Beispiel unten)
  3. Registrieren Sie Ihre Route (siehe zweites Beispiel unten)

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

Register Route:

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

Da haben Sie es. Ein Hander registriert obwohl Code. :)

Wenn Sie eine Steuerung zu schaffen, ich außer Kraft setzen in der Regel die GetDesignTimeHtml Funktion in meinem Control Klasse. Aus dieser Funktion ich überprüfen, ob die Httphandler registriert ist, und wenn nicht, ich es registrieren. Hier ist der Code verwende ich die neuen Httphandler zu registrieren:

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

    }

Die Action-Eigenschaft ist ein statisches Httphandleraction

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top