2012-02-06 21 views
5

Considérese un archivo que contiene la Web.confighttpHandlers declaración siguiente:¿Cómo obtener una referencia al manejador de página ASP.NET predeterminado o al manejador de servicios web?

<httpHandlers> 
    <add verb="*" path="*" type="MyWebApp.TotalHandlerFactory"/> 
</httpHandlers> 

En otras palabras, esta fábrica manejador quiere “ver” todas las peticiones entrantes para que tenga la oportunidad de manejarlos. Sin embargo, esto no necesariamente quiere manejar en realidad todos ellos, sólo aquellos que cumplen una determinada condición de tiempo de ejecución:

public sealed class TotalHandlerFactory : IHttpHandlerFactory 
{ 
    public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) 
    { 
     if (some condition is true) 
      return new MySpecialHttpHandler(); 

     return null; 
    } 

    public void ReleaseHandler(IHttpHandler handler) { } 
} 

Sin embargo, hacerlo así anula por completo el manejador por defecto de ASP.NET, lo que significa que Las páginas ASP.NET y los servicios web ya no funcionan. Acabo de obtener una página en blanco para cada URL que no cumple con "alguna condición" en el "si". Por lo tanto, parece que devolver null es lo incorrecto.

Entonces, ¿qué debo devolver para que las páginas ASP.NET y los servicios web todavía se manejen con normalidad?

+0

Me di cuenta de que es la HttpHandlerFactory no el controlador en sí. – Aliostad

Respuesta

0

No es posible hacer esto en el caso general.

2

Hubiera pensado que la forma más fácil sería heredar su clase de System.Web.UI.PageHandlerFactory y luego en una cláusula else simplemente llame al base.GetHandler().

public sealed class TotalHandlerFactory : System.Web.UI.PageHandlerFactory 
{ 
    public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) 
    { 
     if (some condition is true) 
      return new MySpecialHttpHandler(); 
     else 
      return base.GetHandler(context, requestType, url, pathTranslated) 
    } 
} 
+1

Eso funciona para páginas, pero no para servicios web ... – Timwi

+0

Hmm ... no estoy seguro entonces. Ese era el código que tenía por ahí, pero no era necesario para los servicios web. Sin embargo, no veo ninguna otra manera fácil de crear el controlador básico. :( – Chris

0

Sin conocer todos sus requisitos, que suena como una HttpModule es una solución más adecuada para su problema.

2

Tuve el mismo problema, y ​​parece que hacerlo no es posible con HttpHandlerFactory.

embargo, he encontrado una solución que resuelve el problema: El uso de un HttpModule para filtrar el que solicita debe ir a mi HttpHandler personalizado:

En primer lugar, retire la referencia alguna a su HttpHandler del web.config.

A continuación, agregue una referencia a la siguiente HttpModule dentro de la sección <Modules>:

public class MyHttpModule : IHttpModule 
{ 
    public void Dispose() { } 

    public void Init(HttpApplication application) 
    { 
     application.PostAuthenticateRequest += new EventHandler(application_PostAuthenticateRequest); 
    } 

    void application_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     var app = sender as HttpApplication; 
     var requestUrl = context.Request.Url.AbsolutePath; 

     if (requestUrl "meets criteria") 
     { 
      app.Context.RemapHandler(new MyHttpHandler()); 
     } 
    } 

} 

Por último, asumen a su HttpHandler que todas las peticiones entrantes cumplen sus criterios, y no manejar todas las peticiones.

Cuestiones relacionadas