The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

Visual Studio 2010 建置部署套件與 ASP.NET MVC 的衝突

由於我用 Visual Studio 2010 單鍵部署功能 (建置部署套件) 用的很兇,且剛好 ASP.NET MVC 也用的更兇,這兩個很兇的玩意湊在一起卻有些地方不太相容,問題雖然不大,但第一次遇到此問題也是花了我不少時間釐清問題,不過真像只有一個,就讓我娓娓道來。

首先,專案在建置時會出現以下錯誤,至於在「錯誤清單」視窗所列的檔案名稱、行號、欄位很容易會誤導你前往錯誤的方向,還需要更進一步分析才行:

It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level.  This error can be caused by a virtual directory not being configured as an application in IIS.

It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level.  This error can be caused by a virtual directory not being configured as an application in IIS.

關於這類找不到源頭的問題,尤其是跟 建置 (Build) 有關的問題,請務必先開啟 輸出 (Output) 視窗查看更詳細的資訊,這裡才能進一步分析問題發生的原因,請看以下資訊:

Compile complete -- 0 errors, 23 warnings
  MvcApplication -> X:\Project1\MvcApplication\bin\MvcApplication.dll
X:\Project1\MvcApplication\obj\debug\csautoparameterize\original\web.config(193): error ASPCONFIG: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level.  This error can be caused by a virtual directory not being configured as an application in IIS.
------ Skipped Publish: Project MvcApplication, Configuration: Release Any CPU ------
========== Build: 3 succeeded or up-to-date, 1 failed, 0 skipped ==========
========== Publish: 0 succeeded, 0 failed, 1 skipped ==========

這裡所示的錯誤訊息竟然會出現一個奇怪的路徑,而且是在 obj 目錄下,一般來說,都是在建置專案的時候才會寫入一些檔案在 obj 目錄裡,不過怎麼會有 web.config 檔案呢?那是因為我們在使用 Visual Studio 2010 的時候如果用過了「建置部署套件」功能後,就會在 obj 目錄下產生一堆要建置部署套件所需的檔案與目錄,其中就包括了整個要部署的網站 ( 所有檔案含 web.config 等 )。

alt

不過你也可能會想,為什麼我建置 ASP.NET MVC 會導致建置發生失敗的狀況呢?事實上,並不是所有情況都會發生建置失敗,而是只有在有手動設定 MvcBuildView 設定時才會遇到這個問題,相關設定請參考筆者的另一篇文章【ASP.NET MVC 開發心得分享 (11):對 Views 進行編譯檢查】。

我們從 ASP.NET MVC 專案檔 (*.csproj) 定義的其中一個 AfterBuild 目標可以看到,他定義了一組當 $(MvcBuildView) 設定為 true 時會額外針對整個專案目錄進行 ASP.NET WebSite 的建置,也就是他會對整個專案目錄視為一個 ASP.NET WebSite 進行編譯,而這個功能就是 ASP.NET MVC 用來進行 View 的編譯檢查的方式。

alt

熟悉 ASP.NET MVC 的人應該都知道 ASP.NET MVC 是屬於「ASP.NET Web 應用程式專案」並非「ASP.NET 網站專案」類型,所以可能不會想到 ASP.NET MVC 在進行 Build Views 的時候原來是採用「ASP.NET 網站專案」的方式進行建置。也因此,如果整個目錄包含其子目錄只要出現 web.config 每個都會被檢查,如果有異常於或設定錯誤也都會發生失敗,本篇文章就是用來解釋這整個編譯的過程。

解決這個問題很簡單,只要在建置之前手動將 obj 目錄下的檔案全部刪除即可:

alt

§ 問題總結 §

此問題只會發生在以下條件成立的時候

  • 使用 Visual Studio 2010 的建置部屬套件或單鍵部署功能
  • 使用 ASP.NET MVC 專案類型並啟用 MvcBuildView 的時候

解決方案

  • 刪除 ASP.NET MVC 專案 obj\ 目錄下所有檔案即可

 

相關連結