IIS7 下使用Intelligencia.UrlRewriter時Session爲空問題

背景

新年伊始,本人的開發環境由Windows Server 2003 +IIS 6 升級成了 Windows Server 2008 +IIS 7,以後便着手參加新項目的開發。
項目開發後期測試過程當中,發現了這麼一個問題,那就是使用Intelligencia.UrlRewriter作僞靜態的時候,ASP.NET Session爲空的問題。
ASP.NET 異常截圖以下:
web

後來在網上無心間查到解決方案,就是在system.webServer配置節,設置modules節點的屬性runAllManagedModulesForAllRequests爲「true」。知其然必需要知其因此然,不然下次仍是會趕上一樣的問題。 服務器

IIS集成模式和經典模式

1.經典模式

在IIS 6.0中的經典模式中,ASP.NET是一個添加到IIS中的ISAPI。IIS 7.0之因此支持這種模式,是爲了作到向後兼容。經典模式缺乏許多集成模式才能提供的特性。在經典模式中,IIS擁有自身的管道,這些管道能夠經過建立一個ISAPI擴展進行擴充,而ISAPI擴展是以難以開發而著稱的。ASP.NET做爲一個ISAPI擴展運行,只是IIS管道中的一項組成部分。



2.集成模式

利用集成模式,能夠將ASP.NET做爲IIS的有機組成部分。如今,IIS服務器的功能被劃分爲40多個模塊,所以也就將IIS和ASP.NET的功能劃分爲不一樣的組成部分。諸如StaticFileModule、BasicAuthenticationModule、FormsAuthentication、Session、Profile,以及RoleManager等模塊都是IIS管道的組成部分。而FormsAuthentication、Session、Profile,以及RoleManager本來就是ASP.NET的組成部分,與IIS並沒有關係。

我我的認爲,集成模式很好的複用了代碼,而不關心這些代碼是native code 或者是 managed code.


IIS應用程序的配置系統

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 測試

相關文章
相關標籤/搜索