c# .net asp.net-mvc routes httphandler

c# - ASP.NET MVC Route: omite el controlador de archivos estáticos para la ruta



asp.net-mvc routes (2)

Hay un par de opciones aquí.

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

Si realmente desea que todas las solicitudes se ejecuten a través de la canalización asp.net, entonces necesita.

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

Actualizar

Otra opción, especialmente si su necesidad de omitir el controlador estático está restringida a un subconjunto de su sitio, es usar lo 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 en los sitios de mvc, la mayoría de los archivos estáticos se manejan desde un par de directorios bien conocidos, esta es una mejor opción.

He estado buscando en Google y jugueteando durante un par de horas y realmente no he progresado mucho, así que espero que alguien pueda ayudar.

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

EDITAR Y necesito que todas las solicitudes a todas las otras rutas se comporten normalmente.

Estoy usando un controlador de ruta con un mapeo comodín como este:

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

Todas las rutas tradicionales se reenvían correctamente al controlador, que se reenvía bien al componente de terceros. Cuando golpeo archivos estáticos (.html, .txt, etc.), el controlador StaticFile los recoge en lugar de mi controlador, por lo que estoy intentando apagar el controlador StaticFile así (simplificado):

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

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

Preferiría 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 manera feliz de hacer esto con MVC.

¿Alguna idea? Y gracias.


La mejor solución para esto es, probablemente, usar una Reescritura de URL para enviar las solicitudes de la URL original a una alternativa amigable con 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 te permitirán 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 luego tus métodos de acción son directos:

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

La primera regla de reescritura está ahí para evitar que las rutas que contienen / rel se vuelvan a escribir; Ya están en su forma final. La segunda regla de reescritura proxies (en lugar de redireccionar) la solicitud.

p.ej

/load/1234/file.xml

se convierte en

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

Proxying la solicitud en lugar de hacer una redirección de cliente permite que las rutas relativas anidadas funcionen también (y oculta la salsa secreta del usuario final).