2016年6月27日,這是一個特殊的日子,微軟全新的.NET開發平臺.NET Core的RTM版本正式發布。我個人將.NET Core的核心特性歸結為三點,它們的首字母組成一個非常好記的簡稱——COM,分別代表的含義Cross-Platform、Open-Source和Modularization。開發.NET Core應用的方式與之前具有非常大的變化,對于那些尚未體驗過.NET Core的朋友,我希望通過本篇文章創建的這j幾個Hello World應用可以很容易地帶你們快速入門。
首先我們會介紹如何構建.NET Core應用的開發環境。在這之后,我們會利用dotnet new命令行創建一個控制臺類型的Hello World應用,這個簡單的應用時后續幾個Hello World應用的雛形,后者都是通過它改變而成。我們做的第一個改變是將它變成一個ASP.NET Core應用,并采用Self-Host的方式將它寄宿于這個控制臺應用中。這個ASP.NET Core應用被進一步改造成一個ASP.NET Core MVC應用,我們會自行定義Controller和View已經路由。
目錄
一、構建開發環境
二、執行dotnet new命令創建一個控制臺應用
三、將應用修改成一個ASP.NET Core應用
四、自行指定監聽地址
五、將應用修改成一個ASP.NET Core MVC應用
六、添加View
一、構建開發環境
根據自身的操作系統類型安裝和運行環境.NET Core SDK、IDE和相關的工具
- Windows:https://www.microsoft.com/net/core#windows
- Linux
- Ret Hat :https://www.microsoft.com/net/core#redhat
- Ubuntu :https://www.microsoft.com/net/core#ubuntu
- Debian :https://www.microsoft.com/net/core#debian
- Fedora: https://www.microsoft.com/net/core#fedora
- Centos: https://www.microsoft.com/net/core#centos
- Opensuse: https://www.microsoft.com/net/core#opensuse
- Mac: https://www.microsoft.com/net/core#macos
- Docker:https://www.microsoft.com/net/core#docker
二、執行dotnet new命令創建一個控制臺應用
我們直接啟動命令行工具,為創建的Hello World應用創建一個根目錄(%USERPROFILE% projects/helloworld)。在將該目錄設置為當前目錄后,我們按照如下的方式執行“dotnet new”命令。源代碼下載:netcore.helloworld1
dotnet new命令會為我們創建一個由如下兩個文件組成的控制臺應用。
作為程序入口的Main方法定義在Program.cs文件中,如下所示的代碼片段體現了該文件的整體定義,我們可以看到Main方法僅僅是在控制臺上打印出“Hello World”字樣而已。
1: using System;
2: namespace ConsoleApplication
3: {
4: public class Program
5: {
6: public static void Main(string[] args)
7: {
8: Console.WriteLine("Hello World!");
9: }
10: }
11: }
我們創建的控制臺項目直接映射為一個目錄,項目自身的設置定義在project.json這個文件中,該文件的整體定義反應在如下所示的代碼片段中。整個文件由四個節點組成,其中version和buildOptions用來定義目標項目的版本和編譯選項。dependencies在用來存放針對NuGet包的依賴。我們創建的項目可以針對一個或者多個Framework(比如我們希望創建的可以同時在.NET Framework和.NET Core上運行),支持的Framework定義在frameworks節點下。如果添加了多個Framework,并不是說最終生成的應用可以同時在這些Framework中運行,而是說源文件在編譯的時候會針對這些Framework生成對應的程序集。
1: {
2: "version": "1.0.0-*",
3: "buildOptions": {
4: "debugType": "portable",
5: "emitEntryPoint": true
6: },
7: "dependencies": {},
8: "frameworks": {
9: "netcoreapp1.0": {
10: "dependencies": {
11: "Microsoft.NETCore.App": {
12: "type": "platform",
13: "version": "1.0.0"
14: }
15: },
16: "imports": "dnxcore50"
17: }
18: }
19: }
對于傳統的.NET項目來說,如果我們需要調用某個API,需要添加所在程序集的引用。對于.NET Core來說,所有使用到的程序集都被打包成一個NuGet包,所以針對程序集的直接依賴轉變成針對某個NuGet包的依賴。針對NuGet的依賴主要有兩種類型,一種是針對所有Framework的,它們會直接定義在dependencies節點下,另一種則是針對某個具體Framework的,定義的定義為當前Framework節點下的dependencies子節點。我們定義在Project.json中的設定的NuGet包可能尚未在本地安裝,我們可以執行dotnet restore命令獲取并在本地安裝所有需要的NuGet包。一旦完成了針對NuGet包的回復操作,我們就可以直接執行dotnet run命令來啟動應用。在這期間,我們的應用實際上會經歷一個編譯的過程,我們也可以執行dotnet build命令對其實施編譯。如下面的代碼片段所示,我們分別先后執行restore、build和run三個命令,目標程序最終得以執行。
三、將應用修改成一個ASP.NET Core應用
接下來我們將這個控制臺應用改造成一個最簡單的ASP.NET Core應用。IDE的選擇,我們可以使用VS 2015,也可以使用VS Code,假設我們選擇前者。我們以開啟項目(File->Open->Project/Solution)的方式打開project.json后,相當于開啟了整個控制臺項目。ASP.NET Core的核心管道定義在NuGet包“Microsoft.AspNetCore.Hosting”中,以Self-Host的方式寄宿ASP.NET Core應用還需要一個Server,我們選擇的是定義在“Microsoft.AspNetCore.Server.Kestrel”這個NuGet包中的KestrelServer,所以我們第一步需要做的就是在project.json中添加針對這兩個NuGet包的依賴。源代碼下載:netcore.helloworld2
1: {
2: "version": "1.0.0-*",
3: "buildOptions": {
4: "debugType": "portable",
5: "emitEntryPoint": true
6: },
7: "dependencies": {
8: "Microsoft.AspNetCore.Hosting":"1.0.0",
9: "Microsoft.AspNetCore.Server.Kestrel":"1.0.0"
10: },
11: "frameworks": {
12: "netcoreapp1.0": {
13: "dependencies": {
14: "Microsoft.NETCore.App": {
15: "type": "platform",
16: "version": "1.0.0"
17: }
18: },
19: "imports": "dnxcore50"
20: }
21: }
22: }
ASP.NET Core應用的寄宿依賴于一個WebHost對象,后者則通過對應的工廠WebHostBuilder創建,為此我們將針對WebHost的創建定義在作為入口點的Main方法中。如下面的代碼片段所示,我們創建了一個WebHostBuilder對象,在調用其Build方法創建WebHost對象之前,我們先后調用了前者的UseKestrel和UseStartup方法。前者的目的在于注冊上面提及的這個叫做KestrelServer的Server,后者則注冊一個啟動類型Startup。WeHost的Run方法一旦調用,意味著ASP.NET Core應用被啟動。
1: using System;
2: using Microsoft.AspNetCore.Hosting;
3: using Microsoft.AspNetCore.Builder;
4: using Microsoft.AspNetCore.Http;
5:
6: namespace ConsoleApplication
7: {
8: public class Program
9: {
10: public static void Main(string[] args)
11: {
12: new WebHostBuilder()
13: .UseKestrel()
14: .UseStartup<Startup>()
15: .Build()
16: .Run();
17: }
18: }
19: }
ASP.NET Core應用的背后是一個由Server和Middleware構成的管道,Server實現針對請求的監聽、接收和響應,而注冊的Middleware則負責對請求進行處理。WebHostBuilder的UseKestrel方法為管道注冊了必不可少Server,Middleware的注冊在實現在由UseStartup方法注冊的啟動類型中。如下所示的是我們注冊的Startup類型的定義,我們在Configure方法中調用ApplicationBuilder的擴展方法Run注冊了唯一的Middleware,它對請求的處理邏輯簡單而直接——直接響應一個“Hello World”字符串。
1: using System;
2: using Microsoft.AspNetCore.Hosting;
3: using Microsoft.AspNetCore.Builder;
4: using Microsoft.AspNetCore.Http;
5:
6: namespace ConsoleApplication
7: {
8: public class Startup
9: {
10: public void Configure(IApplicationBuilder app)
11: {
12: app.Run(context=>context.Response.WriteAsync("Hello World"));
13:
14: }
15:
16: }
17: }
我們同樣按照上面的方式執行dotnet restore和dotnet run命令,ASP.NET Core應用將被啟動。
上控制臺上的輸出我們可以看出,ASP.NET Core啟動后會綁定到默認的地址“http://localhost:5000/”來監聽請求,所以我們可以利用瀏覽器向這個地址發送請求,應用處理請求后會按照如下的形式響應由注冊的Middleware寫入的“Hello World”。
四、自行指定監聽地址
我們在利用WebHostBuilder創建WebHost,以及利用后者啟動ASP.NET Core應用的整個過程中并沒有顯式指定Server監聽的地址,在此情況下默認的監聽地址“http://localhost:5000/”會被使用。我們也可以自行指定這個監聽地址,該地址可以通過調用WebHostBuilder的擴展方法UseUrls來指定。如下面的代碼片段所示,我們在利用WebHostBuilder創建WebHost之前調用UseUrls方法注冊了兩個監聽地址“http://localhost:8888/“和“http://localhost:9999/”。源代碼下載:netcore.helloworld3
1: using System;
2: using Microsoft.AspNetCore.Hosting;
3: using Microsoft.AspNetCore.Builder;
4: using Microsoft.AspNetCore.Http;
5:
6: namespace ConsoleApplication
7: {
8: public class Program
9: {
10: public static void Main(string[] args)
11: {
12: new WebHostBuilder()
13: .UseKestrel()
14: .UseStartup<Startup>()
15: .UseUrls("http://localhost:8888/", "http://localhost:9999/")
16: .Build()
17: .Run();
18: }
19: }
20: }
當應用再次被啟動后,監聽地址將發生改變,我們可以改變瀏覽器的目標地址來對此做驗證。
五、將應用修改成一個ASP.NET Core MVC應用
我們繼續對上面這個ASP.NET Core應用進行改造,并將其構建成一個MVC應用。建立在ASP.NET Core的所有的開發框架都是通過注冊到管道中的某一個或者多個Middleware實現的。針對MVC的Middleware實現了路由、Controller的激活、Action方法的執行以及View的呈現。相關的類型通過“Microsoft.AspNetCore.Mvc”這個NuGet包承載,所以我們需要添加這個NuGet包的依賴。簡單起見,我們只需要直接將project.json中添加的“Microsoft.AspNetCore.Hosting”替換成“Microsoft.AspNetCore.Mvc”即可。
1: {
2: "version": "1.0.0-*",
3: "buildOptions": {
4: "debugType": "portable",
5: "emitEntryPoint": true
6: },
7: "dependencies": {
8: "Microsoft.AspNetCore.Mvc":"1.0.0",
9: "Microsoft.AspNetCore.Server.Kestrel":"1.0.0"
10: },
11: "frameworks": {
12: "netcoreapp1.0": {
13: "dependencies": {
14: "Microsoft.NETCore.App": {
15: "type": "platform",
16: "version": "1.0.0"
17: }
18: },
19: "imports": "dnxcore50"
20: }
21: }
22: }
ASP.NET Core MVC相關Middleware的注冊同樣實現在Startup類型的Configure方法中。如下面的代碼片段所示,我們直接調用ApplicationBuilder的擴展方法UseMvc注冊了這個Middleware。由于這個Middleware需要使用到相關的服務,所以我們在另一個名為ConfigureServices的方法中通過調用ServiceCollection的擴展方法AddMvc注冊了這些服務。
1: using Microsoft.AspNetCore.Hosting;
2: using Microsoft.AspNetCore.Builder;
3: using Microsoft.AspNetCore.Http;
4: using Microsoft.Extensions.DependencyInjection;
5:
6: namespace ConsoleApplication
7: {
8: public class Startup
9: {
10: public void ConfigureServices(IServiceCollection services)
11: {
12: services.AddMvc();
13: }
14:
15: public void Configure(IApplicationBuilder app)
16: {
17: app.UseMvc();
18: }
19: }
20: }
對于一個MVC應用來說,任意一個請求都是指向定義在目標Controller的某個Action方法中,接下來我們就來定義如下一個HomeController。ASP.NET Core MVC不像之前的MVC版本要求Controller實現IController接口,它可以是一個普通一個以Controller為后綴命名的公共類型。我們在HomeController中定義的Action方法Index,該方法上應用HttpGetAttribute以特性注入的形式注冊了模板為“/{name}”的路由。
1: using System;
2: using Microsoft.AspNetCore.Mvc;
3:
4: namespace ConsoleApplication
5: {
6: public class HomeController
7: {
8: [HttpGet("/{name}")]
9: public string Index(string name)
10: {
11: return $"Hello {name}";
12: }
13: }
14: }
當我們按照上面的方式啟動這個ASP.NET Core MVC應用后,如果我們利用瀏覽器訪問與注冊路由相匹配的目標地址(“http://localhost:9999/foobar”),可以得到如下所示的相應結果。源代碼下載:netcore.helloworld4
六、添加View
接下來我們為上面這個MVC應用添加View。為此我們需要按照如下的方式改寫HomeController。我們讓它繼承基類Controller,并改變Action方法Index的返回類型(IActionResult),該方法直接調用View方法返回只想默認View的ViewResult對象。再次之前,我們將傳入的參數name保存在ViewBag中。
1: using Microsoft.AspNetCore.Mvc;
2:
3: namespace ConsoleApplication
4: {
5: public class HomeController: Controller
6: {
7: [HttpGet("/{name}")]
8: public IActionResult Index(string name)
9: {
10: ViewBag.Name = name;
11: return View();
12: }
13: }
14: }
接下來我們來定義Action方法Index指向的這個View,按照約定我們應該將對應的Index.cshtml文件存放在/Views/Home目錄下。該View定義如下。
1: <html>
2: <head>
3: <title>Hello</title>
4: <head>
5: <body>Hello, @ViewBag.Name</body>
6: </html>
由于我們使用到了Razor引擎,我們同樣需要將相關的NuGet包“Microsoft.AspNetCore.Razor.Tools”按照如下的方式添加到project.json文件中。除此之外,基于View動態編譯的需要,我們需要添加一個名為“preserveCompilationContext”的編譯選項,并將其值設置為true。
1: {
2: "version": "1.0.0-*",
3: "buildOptions": {
4: "debugType": "portable",
5: "emitEntryPoint": true,
6: "preserveCompilationContext": true
7: },
8: "dependencies": {
9: "Microsoft.AspNetCore.Mvc":"1.0.0",
10: "Microsoft.AspNetCore.Razor.Tools": {
11: "version": "1.0.0-preview2-final",
12: "type": "build"
13: },
14: "Microsoft.AspNetCore.Server.Kestrel":"1.0.0"
15:
16: },
17: "frameworks": {
18: "netcoreapp1.0": {
19: "dependencies": {
20: "Microsoft.NETCore.App": {
21: "type": "platform",
22: "version": "1.0.0"
23: }
24: },
25: "imports": "dnxcore50"
26: }
27: }
28: }
除此之外,View的定位依賴于一個根路徑,所以我們需要按照如下的方式調用WebHostBuilder的UseContentRoot方法將當前目錄設置為此根目錄。
1: using Microsoft.AspNetCore.Hosting;
2: using Microsoft.AspNetCore.Builder;
3: using System.IO;
4:
5: namespace ConsoleApplication
6: {
7: public class Program
8: {
9: public static void Main(string[] args)
10: {
11: new WebHostBuilder()
12: .UseKestrel()
13: .UseStartup<Startup>()
14: .UseContentRoot(Directory.GetCurrentDirectory())
15: .UseUrls("http://localhost:8888/", "http://localhost:9999/")
16: .Build()
17: .Run();
18: }
19: }
20: }
當我們按照上面的方式啟動這個ASP.NET Core MVC應用后,如果我們利用瀏覽器訪問與注冊路由相匹配的目標地址(“http://localhost:9999/foobar”),可以得到如下所示的相應結果。源代碼下載:netcore.helloworld5
文章列表