2

我正在开发一个 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 和样式表(等)时的模块。

希望有人可以帮助我吗?

马丁

4

2 回答 2

0

问题似乎是路由模块。

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

于 2010-04-04T02:51:05.967 回答
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(/.*)?" });

    /* ... */
}
于 2014-03-04T03:41:43.530 回答