MVC之前的那點事兒系列(10):MVC為什麼不再需要註冊萬用字元(*.*)了?

湯姆大叔發表於2014-06-11

文章內容

很多教程裡都提到了,在部署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。

 

另外,要保持這個功能正常使用的話,下列設定需要滿足條件:

  1. EnableExtensionlessUrls沒定義或者是設定值為1。
  2. v4.0 aspnet_filter.dll正常註冊到到IIS上作為ISPAI篩選器。
  3. v4.0 aspnet_isapi.dll處理.axd副檔名的請求,也就是.axd對映到 aspnet_ISPAI.dll上。
  4. v4.0 aspnet_isapi.dll在ISPAI限制列表裡設定為允許Allowed。
  5. 網站設定為可讀,並且有指令碼許可權。

在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

http://blogs.msdn.com/b/tmarq/archive/2010/06/18/how-to-disable-the-asp-net-v4-0-extensionless-url-feature-on-iis-6-0.aspx

http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx

同步與推薦

本文已同步至目錄索引:MVC之前的那點事兒系列

MVC之前的那點事兒系列文章暫時結束,關於MVC正式的部分,希望有時間陸續貼上來。

相關文章