讓.NET MVC Area可以動態放多個專案

CarterTsai
8 min readMay 27, 2017

--

1. 新增專案

2. 建立一個MVC的專案

3. 在專案下建立一個Areas並取名為Test

4. 備份TestAreaRegistration.cs

備份完後將Areas移除專案

5. 接著新增專案

取名為World並且專案位置要設定在原本專案的Area目錄底下以我的範例HelloSite的專案在C:\Temp\HelloSite,所以其他專案的位置必須為C:\Temp\HelloSite\Areas底下,並且選擇為MVC的專案。

接著如果你有在Change Authentication特定為No Authentication的話,接來很多事情是不用做的(之後如果有設定這個的話,我會在文字敘述後面加上(Not to Do for No Authentication )

6. 刪除World以下的目錄

並且將原本備份的TestAreaRegistration.cs加入此專案並且改名為WorldAreaRegistration.cs

  • App_Data
  • App_Start
  • Content
  • View 目錄下的Shared
  • Global.asax
  • Controllers/AccountController.cs (Not to Do for No Authentication)
  • Controllers/ManageController.cs (Not to Do for No Authentication)
  • Views/Account (Not to Do for No Authentication)
  • Views/Manage (Not to Do for No Authentication)

7. 修改WorldAreaRegistration.cs裡面的內容

將原本是”Test”的關鍵字全部用”World”替換掉,並且加入controller的namespace來避免跟HelloSite的controller名字衝突,以及預設的controller設定為Home

7.1 修改HelloSite的RouteConfig.cs

修改HelloSite的RouteConfig.cs的MapRoute加上

namespaces: new string[] { “HelloSite.Controllers” }

8. 將World屬性建置發行改為../../bin

9. 設定HelloSite跟World的專案Web.config

  • appSettings底下加入owin:AutomaticAppStartup並且值設定為 false

<add key=”owin:AutomaticAppStartup” value=”false” />

  • system.web底下的authentication移除 (Not to Do for No Authentication)

<authentication mode=”None” />

10. 將Startup.cs的ConfigureAuth刪除或註解 (Not to Do for No Authentication)

11. 刪除World的專案下的bin目錄

避免再build World的專案的時候dll存錯地方,導致World專案跑不出來

12. 修改World的Home的index.cshtml

做這個動作來確定是不是真的可以在HelloSite站台用Area來切換到World的站台

13. 將HelloSite設定為預設專案,並且將全部專案清除以及重新編譯

編譯完後應該會在HelloSite的目錄的bin中看到HelloSite.dll跟World.dll才對

如果沒有看到World.dll哪麼World的站台將不能使用。

接著執行HelloSite的專案,並且打開瀏覽器應該會看到跟下圖一樣的結果才對,這樣就是成功了。

14. 發行到IIS

首先來發佈發行檔,設定客製的profile取名為release,並且將輸出的目錄設定為C:\Temp\RelaseHelloSite

發佈完成後你應該會發現World.dll並沒有被產生,所以我們要再將World的專案設定發佈

對World的專案設定發行,名字叫做Release_World,目錄名稱為C:\Temp\RelaseWorld

發行完後將World.dll放到C:\Temp\RelaseHelloSite\bin

以及在C:\Temp\RelaseHelloSite底下建立Areas然後再Areas底下在建立一個目錄叫做World

然後再將C:\Temp\RelaseWorld\Views底下的font, Scripts跟Views放到C:\Temp\RelaseHelloSite\Areas\World\Views底下

建立新的站台並且將站台指向HelloSite的目錄,設定完後就可以用瀏覽器打開localhost來測試是不是正常

如果再windows 10用IIS執行的時候出現以下的訊息的話

This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault=”Deny”), or set explicitly by a location tag with overrideMode=”Deny” or the legacy allowOverride=”false”

請將 Application Development Features底下的功能全部安裝,但CGI就不需要了

參考 : https://stackoverflow.com/questions/9794985/iis-this-configuration-section-cannot-be-used-at-this-path-configuration-lock

接著重新執行IIS的站台,就應該可以看到網站正常顯示了

結論

這種做法的好處在於,如果有多個廠商再一起協力坐同一個專案的功能的時候又不想讓其他家廠商互相看到別人的code的時候,還算滿方便的做法。而且還可以動態加入不同的功能,只要大家都用同一個HelloSite的框架

但是壞處是所有廠商所使用的套件要全部管控才行,不能甲廠商用A套件1.0 乙廠商用A套件2.0。開發的時候必須有規範才行。

--

--