設置自定義的入口程序體現應用本身與應用托管之間的分離,它使我們可以創建獨立于托管環境的應用,并根據需要寄宿于任何一個我們希望的宿主程序下,對于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”。
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配置項中。
{ 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類。
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執行的結果。
通過3個Hello World應用來了解ASP.NET 5應用是如何運行的(1)
通過3個Hello World應用來了解ASP.NET 5應用是如何運行的(2)
通過3個Hello World應用來了解ASP.NET 5應用是如何運行的(3)
文章列表