我正在开发一个通过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和样式表(等)时不要调用模块。
希望那里有人可以帮助我吗?
马丁
答案 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(/.*)?" });
/* ... */
}