2009-10-02 44 views
2

我正在开发一个http模块,它通过Authenticate事件挂接到FormsAuthentication模块。当使用mvc /路由模块时,每个请求都会调用Http模块

在调试时,我注意到模块(以及所有其他注册的模块)在每次客户端请求资源时(当它请求图像,样式表,JavaScript文件(等等))时都会被触发。 在集成管道模式下在IIS 7服务器上运行并通过webdev服务器进行调试(处于非集成管道模式)时会发生这种情况

由于我正在开发一个网站,其中有许多图像通常不会被缓存客户端浏览器会在很多不安全的时间点击模块。

我正在使用MVC及其路由机制(System.Web.Routing.UrlRoutingModule)。 创建新网站时,IIS 7(system.webServer)部分的runAllManagedModulesForAllRequests属性在web.config中默认设置为true,作为名称指示使其为每个请求调用所有模块。

如果我将runAllManagedModulesForAllRequests属性设置为false,则不会调用任何模块。

看来,这是因为路由模块或mvc(不知道为什么),这导致asp.net(aspx)处理程序永远不会被调用,因此事件和模块永远不会被调用(一次只是假设)。

我通过试图调用“mydomain.com/Default.aspx”而不是“mydomain.com/”来测试它,并且正确地调用模块只是一次。

我该如何解决这个问题,以便在请求页面时只调用一次模块,而不是在请求所有其他资源时调用这些模块。

有没有什么办法可以注册所有的请求应该触发asp.net(aspx)处理程序,除了特定文件类型扩展的请求? 当然,如果我选择像/ content/images/myimage123这样的图片(不带扩展名),则不会解决问题。但我不能想出任何其他方式来解决它。

有没有更好的方法来解决这个问题?

我试图设置一个ignoreRoute像这样routes.IgnoreRoute(“content/{* pathInfo}”);内容文件夹包含seperat子文件夹中的所有图像,javascript和样式表,但它似乎没有改变任何内容。

设置处理程序时,我可以看到有很多不同的可能性,但我似乎无法弄清楚应该如何设置一个可以使用路由模块并具有urls/blog/post123的应用程序并且在请求图像,JavaScript和样式表(等)时不要调用模块。

希望有人能帮助我吗?

Martin

+0

迁移所有的图片,样式和JavaScript的到一个子域当然会解决问题。 但是,由于这是所有网站使用mvc /路由模块(看起来)和所有内容的同一个域的普遍问题,所以我希望有人能够解决这个问题? – MartinF 2009-10-03 13:34:21

回答

0

该问题似乎是路由模块。

解决方案是将图像,CSS,js移动到子域,或者您可能会注册路由模块应该忽略哪些文件类型/扩展。

0

下面的代码是我在每一个MVC应用程序,以避免对服务静态文件,JavaScript,CSS等引起路由系统的开销使用:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.RouteExistingFiles = false; 
    routes.LowercaseUrls = true; 
    routes.AppendTrailingSlash = true; 
    routes.IgnoreRoute("Content/{*pathInfo}"); 
    routes.IgnoreRoute("Scripts/{*pathInfo}"); 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 

    /* ... */ 
}