使用mvc / routing模块时,每次请求都会调用Http Modules

时间:2009-10-02 23:31:32

标签: model-view-controller routing request httpmodule

我正在开发一个通过Authenticate事件挂钩到FormsAuthentication模块的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这样的网址来获取图片(没有扩展名),那就不会解决问题。但我想不出任何其他方法来解决它。

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

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

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

希望那里有人可以帮助我吗?

马丁

2 个答案:

答案 0 :(得分:0)

问题似乎是路由模块。

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

答案 1 :(得分: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(/.*)?" });

    /* ... */
}