Pregunta

  

Duplicar posibles:
   alguna forma de añadir HttpHandler mediante programación en .NET?

¿Hay alguna manera de registrar dinámicamente un IHttpHandler en código C #, en lugar de tener que añadir manualmente a la sección system.web/httpHandlers en el web.config.

Esto puede sonar loco, pero tengo una buena razón para hacer esto. Estoy construyendo una WidgetLibrary que el propietario de un sitio web puede utilizar con sólo soltar un archivo .dll en su directorio bin, y quieren apoyar esto con una configuración mínima para el web.config.

¿Fue útil?

Solución

No creo que es posible modificar la HttpHandlers una vez que el dominio de aplicación se está ejecutando debido a que los gestores disponibles se leen directamente desde el archivo web.config entonces en caché en una estructura de datos privada.

registrada

Si supieras por adelantado qué extensiones quisiera permitir, que podría hacer es un mapa de estas extensiones a un solo HttpHandlerFactory y luego devolver un manejador de su elección (mediante el uso de la carga y la reflexión ensamblaje dinámico). Por ejemplo:

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

La modificación de la web.config en tiempo de ejecución causaría el dominio de aplicación de reinicio.

Otros consejos

No se pueden modificar los manejadores, pero se puede añadir una ruta al lanzador programáticamente siguiendo estos pasos:

  1. Si es una aplicación para Web Forms a continuación, asegurar su aplicación Web tiene la configuración UrlRouting en el web.config (roturas yip parte de su requerimiento inicial para tener cambios mínimos en web.config) según lo explicado por MS aquí: uso de enrutamiento con web Forms
  2. Implementar la interfaz IRouteHandler en su controlador y devolver el lanzador como el resultado en sus métodos (véase el primer ejemplo a continuación)
  3. Registre su ruta (véase el segundo ejemplo de abajo)

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

Registro Ruta:

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

Ahí lo tienen. Un lanzador registrado a pesar de código. :)

Al crear un control, por lo general anular la función GetDesignTimeHtml en mi clase ControlDesigner. A partir de ese control de funcionamiento I si está registrada la HttpHandler, y si no, que registrarlo. Aquí está el código que utilizo para registrar el nuevo 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 acción de propiedad es una estática HttpHandlerAction

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top