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.

¿Fue útil?

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)(/.*)?" });
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top