ASP.NETCore是一個新的開源和跨平臺的框架,用於構建如Web應用、物聯網(IoT)應用和移動後端應用等鏈接到互聯網的基於雲的現代應用程序。ASP.NET Core應用可運行於.NET Core和完整的.NET Framework之上。構建它的目的是爲那些部署在雲端或者內部運行的應用提 供一個優化的開發框架。它由最小開銷的模塊化的組件構成,所以在構建解決方案的同時能夠 保持靈活性。咱們能夠在Windows、Mac和Linux上跨平臺開發和運行本身的ASP.NET Core 應用。html
ASP.NETCore 開源在 GitHub 上。ASP.NET Core有一些架構上的改變,這些改變使得它成爲一個更爲精簡而且模塊化的框架。ASP.NET Core再也不基於System.Web.dll。當前它基於一系列顆粒化的,而且有良好構建的 NuGet包。這一特色可以讓你經過僅僅包含須要的NuGet包的方法來優化你的應用。一個更小 的應用程序接口經過「只爲你須要的功能付出」(pay-for-what-you-use)模型得到的好處包括: 可靠的安全性、簡化服務、改進性能和減小成本。git
經過ASP.NET Core能夠得到的改進以下:github
使用VS 2017新建一個Web應用,打開VS 2017建立一個新的解決方案,在解決方案中新建一個項目,在添加新項目窗口中選擇 .NET Core,選擇ASP.NETCore Web應用程序,以下圖所示:web
這裏的實例咱們使用 Web Application (MVC) 框架版本爲 .NET Core 2.1 以下圖所示:後端
一個ASP.NET Core 應用其實就是在 Program 類的 Main方法調用 WebHost.CreateDefaultBuilder方法,建立了一個默認的Web應用程序宿主(Web服務器)。相比於.NET Core 1.0 在.NET Core 2.x 少了許多配置,新的方式已經隱藏了不少細節, 在WebHost.CreateDefaultBuilder這個函數內部幫助咱們完成了大部分的配置工做(啓用了Web服務器 UseKestrel、配置內容根目錄 UseContentRoot等)。安全
在下面的代碼中,Main方法建立了一個默認的Web服務器,並指定Startup類(UseStartup)的方法。下面會講解更多關於 Startup 的內容。Build 和 Run 方法構建了用於宿主應用程序的 IWebHost,而後啓動它來監聽傳入的HTTP請求。服務器
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace WebApplicationDome
{
public class Program {
public static void Main(string[] args) {
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
ASP.NET Core 託管模式並不直接監聽請求,而是依賴於一個 HTTP Server 實現來轉發請求到應用程序。這個被轉發的請求會以一組 feature 接口的形式被包裝,而後被應用程序組合到一個 HttpContext 中去。ASP.NET Core 包含了一個託管的跨平臺Web服務器:Kestrel,它每每會 被運行在一個如 IIS 或者 Nginx 的生產 Web 服務器以後。cookie
WebHostBuilderExtensions 的 UseStartup 方法爲你的應用指定了 Startup 類。
Startup類是應用程序的入口(entrypoint),這個類能夠用來定義請求處理管道和配置應用需耍的服務。架構
Startup 類必須是公開的 (public)。
Startup類可以選擇性地在構造函數中接受經過依賴注入提供的依賴項。
Startup類必須定義 Configure方法,可選擇定義一個 ConfigureServices方法,這些方法將在應用程序啓動時被調用:app
public class Startup {
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) {
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
}
}
在ASP.NETCore中,Startup類提供了應用程序的入口,並且在全部應用程序都有Startup類。可能會存在特定環境的啓動類和方法,但不管如何,Startup 類都將被充當爲應用程序的啓動點。
ConfigureServices 方法用於定義應用程序所使用的服務。經過依賴注入可將服務加入服務容器(IoC容器),使其在應用程序中可用。正如 Startup 類能將指定的依賴項做爲其方法參數——而不足硬編碼(hard-coding)來實例化特定實現,在應用程序中的其餘類均可以作到這一點。經過在 IServiceCollection 上使用擴展方法來包裝須要大量配置細節的 ConfigureServices。在下面的例子(使用了默認的Web應用程序MVC模板)中看到 ConfigureServices 方法中有個 AddMvc 的擴展方法被用於設罝應用程序可以使用MVC服務:
public void ConfigureServices(IServiceCollection services) {
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
Configure方法用於指定ASP.NET應用程序將如何響應每個HTTP請求。簡單來講,你能夠配置每一個請求都接收相同的響應。然而,大多數實際的應用程序都須要比這更多的功能。更復雜的管道配置能夠封裝於中間件(middleware)中,並經過擴展方法添加到 lApplicationBuilder 上。Configure 方法必須接受一個 IApplicationBuilder 參數。一些額外服務,好比 IHostingEnvironment 或 ILoggerFactory 也能夠被指定,而且在它們可用的狀況下,這些服務將會被服務器注入進來。在下面的例子(來源於默認的Web應用程序MVC站點模板),多個擴展方法被用於配罝管道,以支持錯誤頁、靜態文件、ASP.NET MVC路由。
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection(); // 添加HTTPS重定向中間件
app.UseStaticFiles(); // 添加靜態文件中間件
app.UseCookiePolicy(); // 使用Cookie策略中間件
app.UseMvc(routes => // 使用MVC中間件
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
每一個 Use 擴展方法都會把一箇中間件加入請求管道中。例如,UseMvc擴展方法增長路由中間件請求管道,並配置MVC爲默認處理程序。
在下一節中間件,將會介紹更多有關中間件的信息,包括使用 IApplicationBuilder 來定義請求管道,建立本身的自定義中間件。
ASP.NETCore在應用程序啓動期間提供了一些應用服務和對象。使用這些服務的方法很是簡單,只要在 Startup 類的構造函數中包含合適的接口,或是在它的 Configure方法、ConfigureServices方法中包含合適的接口便可。下面定義了在Startup類中對每一個方法可用的服務。框架服務和對象包括以下內容:
①. IApplicationBuilder
被用於構建應用程序的請求管道。只能在 Startup 中的 Configure方法裏使用。
②. IApplicationEnvironment
提供了訪問應用程序屬性,相似於ApplicationNamc、ApplicationVersion以及 ApplicationBasePath。能夠在Startup的構造函數和Configure方法中使用。
③. IHostingEnvironment
提供了當前的EnvironmentName、WebRootPath以及Web根文件提供者。能夠在Startup的構造函數和Configure方法中使用。
④. LoggerFactory
提供了建立日誌的機制。能夠在 Startup的構造函數或 Configure 方法中使用,更多請閱讀 Logging。
⑤. IServiceCollection
當前容器中各服務的配置集合。只能在 ConfigureServices 方法中使用。只有在 ConfigureServices方法中配罝後,此服務在應用程序中才變得可用。
看看Startup類中按它們被調用排序的每個方法,下面的服務可做爲參數:
服務是應用程序中用於通用調用的組件。服務經過依賴注入獲取並使用。ASP.NET Core內置了一個簡單的控制反轉(IoC)容器,它默認支持構造器注入,而且能夠方便地替換成你本身選用的 IoC 容器。因爲它的鬆耦合特性,依賴注入(DI)使服務在整個應用中均可以使用。例如,Logging 在整個應用中均可用。
內容根目錄是應用程序所用到的全部內容的根路徑,好比它的 views 和 web內容。默認狀況下,內容根目錄是與宿主應用的可執行程序的應用根目錄相同:其餘位罝能夠經過 WebHostBuilder 來設置。
應用程序的 Web根目錄是項目中相似於 CSS、JS和圖片文件公開、靜態的資源的目錄。靜態文件中間件將默認只讀取Web根目錄和其子目錄中的文件。Web根目錄默認爲[content root]/wwwroot。(能夠經過WebHostBuilder來指定另一個地址)
ASP.NET Core使用了一個新的配置模型,用來處理簡單的鍵值對。新的配置模型不是基於 System.Configuration 或者 web.config;相反,它足一個有序拉取數據的配置 providers。內置的構造提供支持多種不一樣的文件格式,如 XML、JSON、INI和用於支持基於環境的配置環境變量,也能夠本身編寫實現自定義的配罝providers。
ASP.NET Core 支持在多個環境中管理應用程序行爲,如開發Development,預演staging和生產Production,是ASP.NET Core中的第一級概念,並且它可使用環境變量來配置。
將在後面記錄中詳細介紹以上知識點。
《ASP.NET Core 跨平臺開發從入門到實踐》