新年伊始,本人的开发环境由Windows Server 2003 +IIS 6 升级成了 Windows Server 2008 +IIS 7,以后便着手参加新项目的开发。
项目开发后期测试过程当中,发现了这么一个问题,那就是使用Intelligencia.UrlRewriter作伪静态的时候,ASP.NET Session为空的问题。
ASP.NET 异常截图以下:
web
后来在网上无心间查到解决方案,就是在system.webServer配置节,设置modules节点的属性runAllManagedModulesForAllRequests为“true”。知其然必需要知其因此然,不然下次仍是会赶上一样的问题。 服务器
IIS的配置是能够继承的,一般状况下,父节点的配置,会做为子节点的默认配置。固然,子节点的配置也是能够重写父节点的配置的。整个继承体系以下图所示: session
如图所示,其中.net framework root的配置咱们能够在%windir%\Microsoft.NET\这个目录底下找到:
而IIS自己的配置,则被放置在了%windir%\System32\inetsrv\config这个目录下:
这个ApplicationHost.config,里面包含了整个IIS服务器全部特性的配置——应用程序池,站点,应用程序以及虚拟目录...
IIS的每个配置节,都是能够锁定的。一旦锁定了,站点以及站点之下的应用程序都不能重写。要锁定某一个配置节,你只能经过appcmd.exe这个IIS自带的管理工具去设置,详细使用方式再也不本次讨论以内。另外,在modules的每一个子节点,咱们能够看到有一个preCondition的属性。这个属性指定该module运行的条件。只有在条件知足的状况下,这个module才会被执行。
app
固然你也能够经过设置modules节点的属性runAllManagedModulesForAllRequests为“true”,强制全部的module在任何条件下执行。关于module的preCondition更多的属性值,能够参考MSDN:http://www.iis.net/configreference/system.webserver/modules/add
回到一开始的问题上,Session为空,程序没有异常,那么问题就出在作伪静态的URL重写。IIS判断伪静态页面请求不知足Session这个配置节的默认的运行条件:managedHandler,就是说IIS认为这个请求只是请求一个静态文件。
问题找到了,那么一共有两种解决方案,一种是重写这个session module的配置;一种就是设置modules节点的属性runAllManagedModulesForAllRequests为“true”,强制全部的module在任何条件下执行。 工具
参考文章:
http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/50218981-e9e0-49b1-933c-b35a2de6fdde
http://book.51cto.com/art/200908/146143.htm
http://www.iis.net/configreference/system.webserver/modules/add 测试