設定自定義的入口程式體現應用本身與應用託管之間的分離,它使我們可以建立獨立於託管環境的應用,並根據需要寄宿於任何一個我們希望的宿主程式下,對於Web應用來說這一點尤為重要。對於之前的Web應用來說,IIS是它們唯一的宿主,但是ASP.NET 5應用卻可以將我們指定的入口程式作為宿主。如果將應用寄宿於我們指定的宿主程式,這樣的寄宿方式被稱為Self-Host,接下來我們通過一個具體的例子來演示如何定義一個簡單的ASP.NET MVC應用,並採用Self-Host的方式啟動它。
我們在HelloWorld目錄下建立一命名為Project4的子目錄,這個目錄就程式碼了我們即將建立的ASP.NET MVC應用。該目錄下僅僅包含如下3個必需的原始檔:
HomeController.cs
Startup.cs
project.json
我們在這個目錄下建立一個名為HomeController.cs的文字檔案,並按照如下的方式定義這個HomeController型別。ASP.NET MVC 6下對Controller的唯一約束就是相應的型別命名採用“Controller”字尾,所以我們並沒有為HomeController型別指定任何基類。HomeController具有唯一的Action方法Index,它直接返回字串“Hello World”。
1 2 3 4 5 6 7 8 9 10 |
namespace Project4 { public class HomeController { public string Index() { return "Hello World"; } } } |
我們知道一個專案的引用體現為針對另一個程式集(程式集引用)或者專案(專案引用)的依賴。最開始的時候,我們不得不採用手工新增程式集引用或者專案引用的方式來為專案解決依賴問題。後來我們有了NuGet,我們可以將這些依賴定義在相應的NuGet包中,只要我們安裝相應的NuGet包,相應的應用會自動幫我們加上。ASP.NET 5給了我們另一種定義依賴的方式,那就是直接將針對另一個NuGet包或者專案的依賴定義在project.json 檔案中。
我們演示的是一個ASP.MVC應用,所以當前專案針對ASP.MVC框架相關程式集的依賴是必需的,ASP.MVC 6框架相關的程式集均包含在“Microsoft.AspNet.Mvc”這個NuGet包中。在新增的project.json檔案中,我們按照如下的方式將針對這個包(採用的版本為“6.0.0-beta1”)的依賴定義在dependencies配置項中。
1 2 3 4 5 6 7 8 9 10 |
{ dependencies:{ "Microsoft.AspNet.Server.WebListener" : "1.0.0-beta1", "Microsoft.AspNet.Mvc" : "6.0.0-beta1" }, commands:{ "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:3721" } } |
這個project.json檔案的commands配置項中具有一個名為“web”的命令,它採用的入口程式定義在程式集“Microsoft.AspNet.Hosting.dll”中,指定的四個引數實際上旨在提供兩個選項。“–server Microsoft.AspNet.Server.WebListener”用於指定監聽接收請求並最終對請求予以響應的伺服器,而“–server.urls http://localhost:3721”則指定了監聽地址。由於採用的伺服器(實際上是用於建立伺服器的工廠型別)定義在程式集“Microsoft.AspNet.Server.WebListener.dll”,所以我們需要在dependencies配置項中新增對應NuGet包的依賴。
雖然在dependencies中為當前專案定義了所需的依賴,但是執行的時候相應的NuGet包並不會自動下載安裝,所以我們必須保證定義其中的包在執行之前就已經被下載並安裝到本地。ASP.NET所有與NuGet包相關的操作(包括NuGet的下載與安裝,以及對當前專案進行打包)都通過一個叫做KPM.cmd(K Package Manager)來完成。
現在我們開啟Visual Studio 2015 Preview的命令列工具(或者CMD命令列),在利用CD命令將Project4目錄作為當前目錄的情況下安裝如下的方式執行kpm resotre命令。KPM會自動解析定義在project.json中的依賴,並下載所需的所有NuGet包,這些包都被儲存到“%USERPROFILE%\.kpm\package”。也就是說下載並安裝的NuGet包是針對當前使用者下所有專案共享,而不是被當前專案獨佔使用的,所以只要確保相應的包存在,我們無需每次都利用KPM重新獲取。
ASP.NET可以視為一種基礎的架構平臺,它的核心目的在於構建一個統一的、可擴充套件的請求處理管道模型,這個管道由一系列被稱為中介軟體(Middleware)的請求處理器連線而成。建立在它之上的某種開發框架(比如MVC和SignalR等)本質上就是通過自定義的中介軟體來支撐對應的API(比如ASP.MVC和SignalR分別以Controller和Hub核心的API),並最終將這樣的中介軟體註冊到ASP.NET的請求處理管道之中。針對具體開發框架中介軟體的註冊以及相關的設定需要在應用啟動的時候自動完成。在上面演示的例子中,我們將應用初始化相關的操作定義在Startup類中,入口程式在啟動之後會自動對它發起回來以完成對應用的初始化。中介軟體的註冊和其他初始化的操作可以通過類似的方式來實現。為此我們在新增了一名為Startup.cs的文字檔案,並安裝如下的方式 定義初始化ASP.NET MVC應用的這個Startup類。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; namespace Project4 { public class Startup { public void Configure(IApplicationBuilder app) { app.UseMvc(); } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } } } |
KRuntime內建一個DI容器以提供對依賴注入的支援,在應用啟動的時候我們往往需要在這個DI容器中註冊與當前應用相關的服務。在上面定義的這個Startup類中,針對ASP.NET MVC框架的服務註冊定義在ConfigureServices方法中,而相關的中介軟體註冊定義在Configure方法中。到目前為止,所有的開發工作已經結束,我們可以按照上面演示的第二個應用一樣通過執行K.cmd來啟動這個ASP.NET MVC應用。由於我們在project.json檔案中定義命令為“web”,所以我們需要按照如右圖的方式執行命令K web。
ASP.NET MVC宿主程式啟動之後,我們就通過瀏覽器來訪問這個應用了。在project.json檔案中,我們定義的web命令採用了一個地址為“http://localhost:3721”的監聽器,現在我們可以在瀏覽器訪問這個地址來呼叫定義在預設Controller(HomeController)中的預設Action方法(Index),並得到如左圖所示輸出結果。顯示的文字(“Hello World!”)正是Action方法Index執行的結果。