2011-08-04 12 views
5

Este es el escenario:Cómo establecer una costumbre HttpHandler sin utilizar HttpContext.RemapHandler

tengo un HttpHandler que me gustaría una duración de URL específicas, pero esas URLs no tienen extensiones consistentes, por lo que puedo 'mapee el manejador usando httpHandlers en web.config.

En su lugar, tengo un HttpModule personalizado en el que me suscribo a PostAuthenticateRequest, verifico algunas condiciones y asigno mi controlador personalizado usando HttpContext.RemapHandler() si la URL actual califica.

eso es todo lo que trabaja muy bien, pero ...

Para mejorar el rendimiento, me gustaría hacer mi cuenta de cheques URL y controlador de asignación sólo si no está ya asignado un controlador. No te aburriré con por qué mi controlador solo se aplica cuando no se asigna otro controlador, pero siempre es el caso.

El verdadero problema aquí es que sólo se puede probar si un controlador ya está asignado en PostMapRequestHandler, y para entonces, ya es demasiado tarde para usar RemapHandler(), ya que un InvalidOperationException conseguirá tirado (ver http://msdn.microsoft.com/en-us/library/system.web.httpcontext.remaphandler.aspx)

Lo que pensé que podría funcionar en ese punto (pero no lo hace) es HttpContext.Handler = x; en lugar de HttpContext.RemapHandler (x);

Cuando se establece de esta manera, HttpContext.CurrentHandler se actualiza y todo parece glorioso, pero nunca se llama a ProcessRequest() del controlador personalizado.

Gracias de antemano por sus pensamientos/comentarios/ideas.

Respuesta

3

¿Has visto esto? Podría usar el enrutamiento para obtener sus extensiones finales no idénticas para el mismo controlador.

Ver http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

ACTUALIZADO

sugeriría que si va a ser manipuladores de la definición del problema que podría intentar controlar el evento PostResolveRequestCache. Este es el punto en el que el Módulo de enrutamiento Url se conecta para seleccionar un controlador llamando al context.RemapHandler. Posiblemente, incluso podría anular el método PostResolveRequestCache de UrlRoutingModule y llamar al base.PostResolveRequestCache(context), luego configure su controlador si es necesario.

Alternativamente, podría mirar siempre el mapeo de su controlador en la parte inferior de la pila en web.config con un catch all. Luego, las solicitudes de paso que no son interesantes o desasignar el manejador (no estoy seguro de si el desapuntamiento funcionará) si no es necesario.

Espero que esta ayuda. Por favor, háganos saber cómo ir.

+0

Hola Bernie, gracias por la sugerencia. Desafortunadamente, no creo que funcione en mi caso porque también necesito tomar decisiones sobre el manejador basadas en los contenidos del referidor HTTP, y no solo en la URL. Sin embargo, eso no fue especificado en mi pregunta original. Voy a votar esto por el momento y lo marcaré como respuesta si no recibo más respuestas en las próximas semanas. Después de todo, respondiste la pregunta tal como está escrita. ¡Gracias de nuevo! – JLB61000

+0

@ JLB61000 He actualizado la respuesta, espero que esto te brinde algunas ideas más. –

Cuestiones relacionadas