2009-12-11 20 views
19

He estado investigando esto un poco, pero no he encontrado una respuesta: ¿hay alguna manera de agregar programáticamente un HttpHandler a un sitio web ASP.NET sin agregar al web.config?¿Alguna forma de agregar HttpHandler mediante programación en .NET?

+0

Intresting, identificación como para ver si esto es posible a mí mismo. Sin embargo, curioso, ¿por qué no agregarlo web.config? como eso solo afecta al único sitio/aplicación, no todos IIS – Jammin

Respuesta

18

Mediante la adición de un HttpHandler supongo que te refieres a los archivos de configuración

<system.web> 
    <httpHandlers>...</httpHandler> 
</system.web> 

hay una manera de controlar de forma automática, mediante la adición de la IHttpHandler directamente durante la solicitud. Así que en la PostMapRequestHandler in the Application Lifecycle, tendría que hacer lo siguiente, en su propia costumbre IHttpModule:

private void context_PostMapRequestHandler(object sender, EventArgs e) 
{ 
    HttpContext context = ((HttpApplication)sender).Context; 
    IHttpHandler myHandler = new MyHandler(); 
    context.Handler = myHandler; 
} 

y que sería establecer automáticamente el controlador para esa petición. Obviamente, es probable que desee ajustar esto en alguna lógica para verificar cosas como el verbo, la solicitud de url, etc. Pero así es como se haría. Además, este es el número de grabadoras de URL funcionan populares tales como:

http://urlrewriter.codeplex.com

Lamentablemente, sin embargo, el uso de la pre built configuration handler that the web.confi g no, está escondido y no parece que sea accesible. Se basa en una interfaz llamada IHttpHandlerFactory.

Actualización El IHttpHandlerFactory se puede utilizar como cualquier otro IHttpHandler, solo se utiliza como punto de inicio en lugar de como punto de procesamiento. Vea este artículo.

http://www.uberasp.net/getarticle.aspx?id=49

+0

Gracias Nick: esto es exactamente lo que estaba buscando. –

+0

Tengo problemas para lograr que este enfoque funcione para mi situación. Las solicitudes a las que intento reasignar un controlador no corresponden a archivos físicos ni a ninguna de las rutas configuradas. ¿No se activará 'PostMapRequestHandler' en mi caso ya que no se encuentra ningún controlador para mapear la solicitud? Parece que el último evento que se activa para estas solicitudes es 'PostResolveRequestCache' y si intento restablecer' context.Handler' en ese o en cualquier controlador de eventos anterior, simplemente se ignora. – Lobstrosity

+0

Pude hacerlo funcionar llamando 'context.RemapHandler()' (en lugar de configurar 'context.Handler' directamente) en el manejador de eventos' BeginRequest'. – Lobstrosity

10

Puede mediante el uso de una clase IRouteHandler.

  1. Implementar la interfaz IRouteHandler de una nueva clase y devolver el lanzador como el resultado de su GetHttpHandler método
  2. Registre su ruta/

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

Ruta de registro:

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

Nota: Si está utilizando ASP.NET WebForms a continuación, asegurar su aplicación Web tiene la configuración UrlRouting en el web.config como se explica aquí: Use Routing with Web Forms

+0

Gracias! Exactamente lo que necesitaba ... – rocky

Cuestiones relacionadas