文章內容
很多教程裡都提到了,在部署MVC程式的時候要配置萬用字元對映(或者是*.mvc)到aspnet_ISPAI.dll上,在.NET4.0之前確實應該這麼多,但是.NET4.0之後已經不要再費事了,因為它預設就支援了。
你可以會問,沒有對映配置,請求這麼可能會走到aspnet_ISPAI.dll上呢?對,這就是我們本章節要講的一個東西:ASP.NET 4 Extensionless URL feature,因為在ASP.NET4之後,預設所有的請求都轉向到aspnet_ISPAI.dll,那麼在IIS6上它是如何實現的呢?首先ASP.NET4.0安裝的時候會自動安裝一個aspnet_filter.dll ,這是一個ISAPI篩選器,該篩選器在請求處理之前,會將所有的URL地址附加上/eurl.axd/GUID字串,而預設情況下*.axd副檔名是對映到aspnet_isapi.dll上的,所以當我們附加/eurl.axd/GUID字串以後,所有的請求都可以被aspnet_isapi.dll來處理了,當進入ASP.NET的時候的時候又把該/eurl.axd/GUID 字串刪除了(這個週期非常早),以便還原成原來的URL地址。.NET框架根目錄下的web.config預設設定請求是DefaultHttpHandler來處理的,因為它的path=”*”,並且放在httpHandlers的第一個位置上(除非你修改了設定),此後DefaultHttpHandler將這個請求轉發(不是URL跳轉哦)至IIS上,這時候我們的篩選器不會再附加/eurl.axd/GUID字串了,接下來就是正常的處理請求了,如果你想利用此特性做其它特殊的事情,那你需要在MapRequestHandler事件執行之前,修改DefaultHttpHandler為其它的HttpHandler。
有一點需要注意的是,IIS7整合模式下,處理請求的預設Handler是不是DefaultHttpHandler而是TransferRequestHandler,兩個Hanlder是差不多的,具體的細節不同不在我們討論的範疇,我們就不多說了,這些handler預設是隨.NET4.0安裝的時候一起安裝,但是IIS7預設是不啟用這個功能的,只有在安裝了IIS7的QFE才能使用,QFE包含在service pack中,QFE獨立下載地址為http://support.microsoft.com/kb/980368。
另外,要保持這個功能正常使用的話,下列設定需要滿足條件:
- EnableExtensionlessUrls沒定義或者是設定值為1。
- v4.0 aspnet_filter.dll正常註冊到到IIS上作為ISPAI篩選器。
- v4.0 aspnet_isapi.dll處理.axd副檔名的請求,也就是.axd對映到 aspnet_ISPAI.dll上。
- v4.0 aspnet_isapi.dll在ISPAI限制列表裡設定為允許Allowed。
- 網站設定為可讀,並且有指令碼許可權。
在IIS6上要想禁用這個功能,修改登錄檔檔案HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\EnableExtensionlessUrls為0就可以實現,因為IIS只有重啟的時候才載入這個配置,所以需要重啟一下才能生效。Wow64下(比如64為OS下允許32位worker process)則需要設定HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\4.0.30319.0\EnableExtensionlessUrls為0.
IIS 6, ASP.NET 4, 和ASP.NET MVC 3可以成功使用上述功能(甚至MVC2也可以,MVC1未測試),所以,以後在ASP.NET4.0上部署站點的時候,不必再設定萬用字元對映就可以使用MVC3功能了。
參考資料:
http://haacked.com/archive/2010/12/22/asp-net-mvc-3-extensionless-urls-on-iis-6.aspx
同步與推薦
本文已同步至目錄索引:MVC之前的那點事兒系列
MVC之前的那點事兒系列文章暫時結束,關於MVC正式的部分,希望有時間陸續貼上來。