【发布时间】:2009-10-02 23:31:32
【问题描述】:
我正在开发一个 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 和样式表(等)时不调用模块。
希望有人可以帮助我吗?
马丁
【问题讨论】:
-
将所有图像、样式表和 javascript 移动到子域当然可以解决问题。但由于这是所有使用 mvc/routing 模块(似乎)的网站和所有内容的相同域的普遍问题,我希望有人能解决这个问题?
标签: model-view-controller routing request httpmodule