Las solicitudes de archivos estáticos están presionando el código administrado en ASP.NET MVC3
-
28-10-2019 - |
Pregunta
Creación de ihttpmodules personalizados, me he dado cuenta de que las solicitudes de archivos estáticos (por ejemplo: archivos .css y .js) están presionando los módulos administrados. Probablemente las imágenes tienen el mismo problema. ¿No debería IIS omitir ASP.NET para archivos que existe en el sistema de archivos?
Por ejemplo:
public class MyModule:IHttpModule
{
public void Dispose(){ }
public void Init(HttpApplication context)
{
context.BeginRequest += (o, e) => Debug.Print("Request: " + HttpContext.Current.Request.RawUrl);
}
}
Y lo declaro de esta manera:
<modules runAllManagedModulesForAllRequests="true">
<add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX"/>
</modules>
Pero, incluso usando la condición previa, puedo ver cómo los archivos estáticos atraviesan el módulo:
Request: /MVCX/
Request: /MVCX/Content/Site.css
Request: /MVCX/Scripts/jquery-1.4.4.min.js
He tratado de ignorar las reglas para archivos estáticos, pero no marca la diferencia:
routes.IgnoreRoute("{Content}/{*pathInfo}");
routes.IgnoreRoute("{Scripts}/{*pathInfo}");
¿Es esto lo habitual? ¿O me estoy perdiendo algo aquí? Hasta donde yo sé, si la solicitud de archivo estático debe ser respondida por IIS. Si mi módulo administrado está siendo golpeado, significa que un hilo de threadpool CLR está manejando esa solicitud, ¿verdad?
Saludos.
ACTUALIZAR:
He desactivado las "RunallManagedModulesForallRequests":
<modules runAllManagedModulesForAllRequests="false">
<add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>
Y todo parece funcionar bien, pero he encontrado este artículo: http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html Eso recomienda eliminar y leer el módulo "UrlRoutingModule-4.0" con una condición previa vacía.
En mi máquina, la adición de ese módulo está en la raíz web.config, y ya tiene una condición previa vacía:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type machine.config | find "UrlRouting"
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type web.config | find "UrlRouting"
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>
Así que ahora estoy un poco confundido, ¿cuál es el estado de este parámetro? ¿Debo usarlo o no debería? ¿Por qué viene como "verdadero" de forma predeterminada?
Saludos.
Solución
Yo mi máquina, la adición de ese módulo está en la raíz web.config, y ya tiene una condición previa vacía
Perfecto. Eso significa que este módulo siempre se ejecutará, lo que se requiere para MVC, ya que utiliza URL de extensión.
Así que ahora estoy un poco confundido, ¿cuál es el estado de este parámetro? ¿Debo usarlo o no debería? ¿Por qué viene como "verdadero" de forma predeterminada?
Porque el soporte de URL sin extensión es nuevo en IIS7 SP1 e IIS7.5 SP1. Está disponible para IIS7 como un parche que debe solicitar e instalar. Lo encontrará aquí con respuestas completas a sus preguntas:http://support.microsoft.com/kb/980368
¿Por qué este parámetro es cierto de forma predeterminada? Porque VS2010 fue enviado antes de IIS7 SP1. ¿Quizás está en falso en nuevos proyectos MVC en VS2010SP1?
Otros consejos
Respondiendo a su primera pregunta sobre el hecho de que IIS debe evitar ASP.NET para obtener contenido estático.
Si está configurado en modo integrado, IIS 7.5, permitirá que los módulos administrados se registren para eventos relacionados con solicitudes que ASP.NET no manejan tradicionalmente, como archivos estáticos.
Esto no sucede en el modo Classic IIS 7.5, que es similar al IIS 6 y no permite que un módulo administrado escuche eventos en las solicitudes que no manejan ASP.NET.
Entonces, básicamente si tienes runAllManagedModulesForAllRequests="true"
Con el modo integrado, su módulo administrado será notificado de eventos para cada solicitud. Además, de la documentación sobre runAllManagedModulesForAllRequests
:
Es cierto que todos los módulos administrados pueden procesar todas las solicitudes, incluso si la solicitud no era para contenido administrado; de lo contrario, falso.
El valor predeterminado es falso.
La documentación no explica cómo este atributo interactúa con el preCondition
opción. Por lo que experimentaste parece anular el preCondition
Configuración, así que si fuera tú, lo dejaría en false
Y solo trabaja con el preCondition
opciones incluso si significa alterar otros módulos previos a una cadena vacía para solucionar el cambio de runAllManagedModulesForAllRequests
a falso.
Actualizar: Encontré algo de documentación sobre las implicaciones del uso de runAllManagedModulesForAllRequests
y como ya se dijo, si es cierto, es una anulación para el preCondition
con un managedHandler
opción.
También puede usar un acceso directo para habilitar todos los módulos administrados (ASP.NET) para ejecutarse para todas las solicitudes de su aplicación, independientemente de la condición previa "ManagedHandler". Para habilitar todos los módulos administrados se ejecuten para todas las solicitudes sin configurar cada entrada de módulo para eliminar la condición previa "ManagedHandler", use la propiedad RunAlLManEdModulesForAllRequests en la sección:
Cuando usa esta propiedad, la condición previa "ManagedHandler" no tiene ningún efecto y todos los módulos administrados se ejecutan para todas las solicitudes.
Puede escribir el siguiente código para ello.
routes.IgnoreRoute("{*allcss}", new { allaspx = @".*\.css(/.*)?" });
routes.IgnoreRoute("{*alljs}", new { allaspx = @".*\.js(/.*)?" });
Encuentre más información sobre el siguiente enlace
http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx
Supongo que, si realmente desea ignorar, no debe usar soportes curvos:
routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("Scripts/{*pathInfo}");
Intente esto para ignorar la lista de todos los archivos estáticos
routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });