﻿# 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.](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/836c6fe73e23084633d7-image_366.png "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](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/bf615b00e910f92dc220-image_367.png "title")

不過你也可能會想，為什麼我建置 ASP.NET MVC 會導致建置發生失敗的狀況呢？事實上，並不是所有情況都會發生建置失敗，而是只有在有手動設定 **MvcBuildView** 設定時才會遇到這個問題，相關設定請參考筆者的另一篇文章【[ASP.NET MVC 開發心得分享 (11)：對 Views 進行編譯檢查](/post/2009/09/04/ASPNET-MVC-Developer-Note-Part-11-Compile-Views-in-ASPNET-MVC.aspx)】。

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

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3c8a144f9245a28e3b25-image_368.png "title")

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

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

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b4baca48866d87a89c42-image_369.png "title")

**§ 問題總結 **§****

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

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

**解決方案**

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

**相關連結**

-   [AspNetCompiler Task](http://msdn.microsoft.com/en-us/library/ms164291.aspx)
-   [MSBuild Task Reference](http://msdn.microsoft.com/en-us/library/7z253716.aspx)
-   [ASP.NET MVC 開發心得分享 (11)：對 Views 進行編譯檢查](/post/2009/09/04/ASPNET-MVC-Developer-Note-Part-11-Compile-Views-in-ASPNET-MVC.aspx)
