【问题标题】:Http Modules are called on every request when using mvc/routing module使用 mvc/routing 模块时,每个请求都会调用 Http 模块
【发布时间】: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


【解决方案1】:

问题似乎出在路由模块上。

解决方案是将图像、css、js 移动到子域,或者您可以注册路由模块应该忽略的文件类型/扩展名。

【讨论】:

    【解决方案2】:

    以下代码是我在每个 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(/.*)?" });
    
        /* ... */
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2015-11-13
      • 2018-06-03
      • 2016-03-18
      • 2017-11-15
      相关资源
      最近更新 更多