文章出處

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和相關的工具

二、執行dotnet new命令創建一個控制臺應用

我們直接啟動命令行工具,為創建的Hello World應用創建一個根目錄(%USERPROFILE% projects/helloworld)。在將該目錄設置為當前目錄后,我們按照如下的方式執行“dotnet new”命令。源代碼下載:netcore.helloworld1

image

dotnet new命令會為我們創建一個由如下兩個文件組成的控制臺應用。

image

作為程序入口的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三個命令,目標程序最終得以執行。

image

三、將應用修改成一個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應用將被啟動。

image

上控制臺上的輸出我們可以看出,ASP.NET Core啟動后會綁定到默認的地址“http://localhost:5000/”來監聽請求,所以我們可以利用瀏覽器向這個地址發送請求,應用處理請求后會按照如下的形式響應由注冊的Middleware寫入的“Hello World”。

image

四、自行指定監聽地址

我們在利用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: }

當應用再次被啟動后,監聽地址將發生改變,我們可以改變瀏覽器的目標地址來對此做驗證。

image

五、將應用修改成一個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

image

六、添加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

image


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()