2012-06-29 11 views
17

He estado buscando en Google y retocando durante un par de horas y realmente no he progresado mucho, así que espero que alguien aquí pueda ayudar.Ruta ASP.NET MVC: desviar el manejador de archivos estáticos para la ruta

Estoy tratando de que todas las solicitudes a una determinada ruta sean manejadas por un componente de terceros.

EDIT Y necesito todas las solicitudes a todas las demás rutas para comportarse normalmente.

estoy usando un controlador de ruta con una asignación de comodín como esto:

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler())); 

Todas las rutas tradicionales hacia adelante correctamente al controlador, que reenvía muy bien al componente de tercera parte. Cuando toco archivos estáticos (.html, .txt, etc.), el manejador de StaticFile los selecciona en lugar de mi controlador, por lo que intento desactivar el controlador StaticFile como (simplificado):

<system.webServer> 
    <handlers> 
    <remove name="StaticFile"/> 
    </handlers> 
</system.webServer> 

Esto desactiva el controlador StaticFile, pero MVC aún no recoge la ruta.

Prefiero no recurrir a la creación de mi propio controlador e inyectar en la pila de solicitudes ASP, ya que parece que debería haber una forma MVC feliz de hacerlo.

¿Alguna idea? Y gracias.

Respuesta

14

Aquí hay un par de opciones.

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

Si realmente quiere todas las solicitudes que se ejecutan a través de la tubería de asp.net entonces que necesite.

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

actualización

Otra opción, especialmente si su necesidad de pasar por alto el manejador estática está restringido a un subconjunto de su sitio, es utilizar la siguiente

<add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/subdirectory/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

Teniendo en cuenta cómo el Los sitios mvc, la mayoría de los archivos estáticos se manejan desde un par de directorios conocidos, esta es una mejor opción.

+0

Gracias. Definitivamente es algo que probé, pero quiero que todos los demás caminos se manejen normalmente. Realmente está empezando a parecer que no hay una forma de MVC para hacer esto, y debería descomponerlo y agregar el controlador antes de MVC. – jmoss

+0

No estoy seguro acerca de los detalles de exactamente lo que quiere y no quiere manejar, pero sí, para poder manejar cosas en mvc, el tubo asp.net necesita recibir todas las solicitudes apropiadas. –

+0

NOTA IMPORTANTE: '' solo se aplica a grupos de aplicaciones que ejecutan un canal de modo integrado. Esto no funcionará para los grupos de aplicaciones que se ejecutan en modo clásico. – BenSwayne

2

La mejor solución para esto es, probablemente, utilizar un URL Rewriter para proxy de las solicitudes de la URL original a una alternativa amistosa MVC.

Por ejemplo, supongamos que debe poder cargar automáticamente las URL relativas en el contenido servido desde una base de datos.

RewriteRule ^/load/(\d+)/rel(\?.*)? - [L] 
RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC] 

Esas reglas le permiten configurar dos rutas MVC:

routes.MapRoute(
    "Load Item", 
    "load/{itemId}", 
    new { controller = "Load", action = "Index" } 
    ); 

routes.MapRoute(
    "Load Relative Item", 
    "load/{itemId}/rel", //?path= 
    new { controller = "Load", action = "Relative" } 
    ); 

Y a continuación, sus métodos de acción son sencillos:

public ActionResult Index(int itemId) { ... } 

public FileStreamResult Relative(int itemId, string path) { ... } 

La primera regla de reescritura está ahí para evitar rutas que contienen/rel de ser reescrito; ya están en su forma final. La segunda reescribe los proxies de la regla (en lugar de redirigir) la solicitud.

p. Ej.

/load/1234/file.xml 

convierte

/load/1234/rel?path=file.xml 

Realizar una aproximación de la solicitud en lugar de hacer una redirección de cliente permite a las rutas relativas anidadas funcionan tan bien (y oculta la salsa secreta del usuario final.)

Cuestiones relacionadas