新年伊始,本人的開發環境由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 測試