我正在开发一个 http 模块,它通过 Authenticate 事件连接到 FormsAuthentication 模块。
在调试时,我注意到模块(和所有其他注册的模块)在每次客户端请求资源时都会被命中(也当它请求图像、样式表、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 这样的 URL 来获取图像(没有扩展名),那当然不会解决问题。但我想不出任何其他方法来解决它。
有没有更好的方法来解决这个问题?
我试图设置这样的 ignoreRoute routes.IgnoreRoute("content/{*pathInfo}"); 其中 content 文件夹包含 seperat 子文件夹中的所有图像、javascript 和样式表,但它似乎没有改变任何东西。
在设置处理程序时,我可以看到许多不同的可能性,但我似乎无法弄清楚应该如何设置一个可以使用路由模块并具有 /blog/post123 之类的网址而不调用请求图像、javascript 和样式表(等)时的模块。
希望有人可以帮助我吗?
马丁