接獲報案,ASP.NET MVC 4(.NET 4.5)部署到Windows 2008/IIS 7無法正常運作,存取png或css等靜態檔案OK,而MVC的controller/action路由沒生效,連上根目錄出現HTTP 403.14,推測為home/index路由失效,又沒有index.html、default.aspx等預設文件導致:

很類似「IIS6 缺少萬用字元應用程式對應」造成的現象(參考),但在我的經驗,只有Windows 2003需要額外手工設定,IIS 7以上應該內建支援MVC路由才對。

經過一番調查,發現問題癥結所在-問題主機是Windows 2008 SP2,不是常見的Windows 2008 R2,而且它的IIS是IIS 7.0不是IIS 7.5!

若對應到Windows客戶端版本,Windows 2008相當於Vista、Windows 2008 SP2相當於Vista SP2,Windows 2008 R2才對應到Windows 7。Windows 7是不少技術的作業系統最低要求,而我平常摸到的Windows 2008都是R2以上版本,就沒意識到Windows 2008非R2版本存在支援度不足的問題。

知道問題癥結就好辦,在web.config加入以下設定即可解決問題:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
  <!-- 略 -->
</system.webServer>

而另一個問題是-為什麼ASP.NET MVC 4 web.config檔少了這個設定?當年不就會害一堆人踩到雷?再深入研究,這源自Visual Studio ASP.NET MVC 4專案範本 .NET 4版與.NET 4.5版的差異(參考:保哥的文章)。若採用.NET 4版ASP.NET MVC 4,web.config有內含<modules runAllManagedModulesForAllRequests="true" />,部署到Windows 2008 SP2 + IIS 7可以過關;但網站演進到新一代的.NET 4.5 ASP.NET MVC 4,基於效能考量已拿掉runAllManagedModulesForAllRequests設定,沒料想到會遇到遲未升級的古老Windows 2008 SP2,就…

如果擔心加入runAllManagedModulesForAllRequests影響效能,另一個解決方案是安裝KB980368,讓IIS 7也能處理MVC這類沒有副檔名的路由URL,會是較完美的做法。


Comments

# by Jimmy Oliver

應該是 <modules runAllManagedModulesForAllRequests="true" />

# by Jeffrey

to Jimmy, 我居然寫反了(遮臉),謝謝指正。

Post a comment