ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)
在上一節(jié)(ASP.NET Core 運(yùn)行原理剖析1:初始化WebApp模版并運(yùn)行)中提到ASP.NET Core WebApp 必須含有Startup類,在本節(jié)中將重點(diǎn)講解Startup類以及Middleware(中間件)在Startup類中的使用。
Startup Class
Startup Class中含有兩個(gè)重要方法:Configure方法用于每次http請(qǐng)求的處理,比如后面要講的中間件(Middleware),就是在configure方法中配置。而ConfigureServices方法在Configure方法前調(diào)用,它是一個(gè)可選的方法,可在configureServices依賴注入接口或一些全局的框架,比如EntityFramework、MVC等。Startup 類的 執(zhí)行順序:構(gòu)造 -> configureServices->configure。
1、Startup Constructor(構(gòu)造函數(shù))
主要實(shí)現(xiàn)一些配置的工作,方法參數(shù)如下:
IHostingEnvironment:?用于訪問應(yīng)用程序的特殊屬性,比如applicationName,applicationVersion。通過IHostingEnvironment對(duì)象下的屬性可以在構(gòu)造中實(shí)現(xiàn)配置工作。比如獲取當(dāng)前根路徑找到配置json文件地址,然后ConfigurationBuilder初始化配置文件,最后可以通過GetSection()方法獲取配置文件。代碼清單如下:
根目錄下的配置文件如下:
{"Data": {"DefaultConnection": {"ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=_CHANGE_ME;Trusted_Connection=True;"}}}ILoggerFactory:?提供創(chuàng)建日志的接口,可以選用已經(jīng)實(shí)現(xiàn)接口的類或自行實(shí)現(xiàn)此接口,下面代碼使用最簡(jiǎn)單的控制臺(tái)作為日志輸出。
2、ConfigureServices
主要實(shí)現(xiàn)了依賴注入(DI)的配置,方法參數(shù)如下:
IServiceCollection:整個(gè)ASP.NET Core 默認(rèn)帶有依賴注入(DI),IServiceCollection是依賴注入的容器,首先創(chuàng)建一個(gè)類(Foo)和接口(IFoo),代碼清單如下:
在ConfigureServices 中將接口和實(shí)現(xiàn)注入至容器
public void ConfigureServices(IServiceCollection services) ? ? ? {services.AddTransient<IFoo, Foo>();}如果想在每次Http請(qǐng)求后都使用IFoo的GetFoo()方法來處理,上面講到可以在Configure方法中注冊(cè)函數(shù),在注冊(cè)過程中由于使用了依賴注入(DI),因此可以直接通過RequestServices.GetRequiredService<IFoo>()泛型方法將IFoo對(duì)象在容器中取出。
app.Run((context) =>{ ? ? ? ? ? ? ? var str = context.RequestServices.GetRequiredService<IFoo>().GetFoo(); ? ? ? ? ? ? ? return context.Response.WriteAsync(str);});除了自己的接口外,還支持通過擴(kuò)展方法添加更多的注入方法,比如EntityFramework、mvc框架都實(shí)現(xiàn)自己的添加方法。
public void ConfigureServices(IServiceCollection services){ ? ?// Add framework services.services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();services.AddMvc(); ? ?// Add application services.services.AddTransient<IFoo, Foo>();}3、Configure方法
主要是http處理管道配置和一些系統(tǒng)配置,參數(shù)如下:
IApplicationBuilder:?用于構(gòu)建應(yīng)用請(qǐng)求管道。通過IApplicationBuilder下的run方法傳入管道處理方法。這是最常用方法,對(duì)于一個(gè)真實(shí)環(huán)境的應(yīng)用基本上都需要比如權(quán)限驗(yàn)證、跨域、異常處理等。下面代碼調(diào)用IApplicationBuilder.Run方法注冊(cè)處理函數(shù)。攔截每個(gè)http請(qǐng)求,輸出Hello World。
IHostingEnvironment:?同構(gòu)造參數(shù)
ILoggerFactory:?同構(gòu)造參數(shù)
Middleware
中間件是一個(gè)處理http請(qǐng)求和響應(yīng)的組件,多個(gè)中間件構(gòu)成了處理管道(Handler pipeline),每個(gè)中間件可以決定是否傳遞至管道中的下一中間件。一旦注冊(cè)中間件后,每次請(qǐng)求和響應(yīng)均會(huì)被調(diào)用。
1、中間件注冊(cè)
中間件的注冊(cè)在startup中的Configure方法完成,在configure方法中使用IApplicationBuilder對(duì)象的Run、Map、Use方法傳入匿名委托(delegate)。上文示例注冊(cè)IFoo.GetFoo()方法就是一個(gè)典型的中間件。
Run & Use:?添加一個(gè)中間件至請(qǐng)求管道。它們?cè)诠δ芎茴愃频且泊嬖谝恍﹨^(qū)別,先來看下兩個(gè)方法的定義。
Run是通過擴(kuò)展方法語法來定義,傳入入?yún)⑹荝equestDelegate的委托,執(zhí)行完一個(gè)第一個(gè)run后是不會(huì)激活管道中的第二個(gè)run方法,這樣代碼執(zhí)行結(jié)果只會(huì)輸出一個(gè)“hello world!”
app.Run((context) => context.Response.WriteAsync("Hello World!"));app.Run((context) => context.Response.WriteAsync("Hello World 1!"));而use方法的入?yún)t是Func<>的委托包含兩個(gè)入?yún)⒑鸵粋€(gè)返回值,這樣在第一個(gè)函數(shù)執(zhí)行完成后可以選擇是否繼續(xù)執(zhí)行后續(xù)管道中的中間件還是中斷。
app.Use((context, next) =>{context.Response.WriteAsync("ok"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? return next();}); app.Use((context, next) =>{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? return context.Response.WriteAsync("ok");});Map:?含有兩個(gè)參數(shù)pathMatche和configuration,通過請(qǐng)求的url地址匹配相應(yīng)的configuration。例如可以將url路徑是/admin的處理函數(shù)指定為如下代碼:
2、常用中間件
| Authentication | 提供權(quán)限支持 |
| CORS | 跨域的配置 |
| Routing | 配置http請(qǐng)求路由 |
| Session | 管理用戶會(huì)話 |
| Static Files | 提供對(duì)靜態(tài)文件的瀏覽 |
這里有一些官方的示例,鏈接
以上內(nèi)容有任何錯(cuò)誤或不準(zhǔn)確的地方請(qǐng)大家指正,不喜勿噴!
作者:帥蟲哥 出處:?http://www.cnblogs.com/vipyoumay/p/5640645.html
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。如果覺得還有幫助的話,可以點(diǎn)一下右下角的【推薦】,希望能夠持續(xù)的為大家?guī)砗玫募夹g(shù)文章!想跟我一起進(jìn)步么?那就【關(guān)注】我吧。
參考鏈接
[1]?https://docs.asp.net/en/latest/fundamentals/middleware.html
[2]?http://www.talkingdotnet.com/app-use-vs-app-run-asp-net-core-middleware/
相關(guān)文章:
ASP.NET Core 1.0 入門——了解一個(gè)空項(xiàng)目
ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)
.NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0簡(jiǎn)介
云服務(wù)器下ASP.NET Core 1.0環(huán)境搭建(包含mono與coreclr)
使用VS Code開發(fā)ASP.NET Core 應(yīng)用程序
dotnet run是如何啟動(dòng)asp.net core站點(diǎn)的
ASP.NET Core提供模塊化Middleware組件
“dotnet restore"和"dotnet run"都做了些什么?
探秘 dotnet run 如何運(yùn)行 .NET Core 應(yīng)用程序
.NET Portability Analyzer 已開源
ASP.NET Core的配置(1):讀取配置信息
ASP.NET Core的配置(2):配置模型詳解
.NET Core 1.0 RC2 歷險(xiǎn)之旅
使用VS Code開發(fā) 調(diào)試.NET Core 應(yīng)用程序
讓我們Core在一起:ASP.NET Core & .NET Core
.NET Core VS Code 環(huán)境配置
官方博客明確了 .NET Core RC2/RTM 時(shí)間表
.NET Core全新的配置管理[共9篇]
利用記事本創(chuàng)建一個(gè)ASP.NET Core RC2 MVC應(yīng)用
微軟.NET 正式劈腿成功,橫跨所有平臺(tái)
.NET Core 1.0 CentOS7 嘗試
解讀發(fā)布:.NET Core RC2 and .NET Core SDK Preview 1
[.NET Core].NET Core R2安裝及示例教程
ASP.NET Core 開發(fā)-中間件(Middleware)
結(jié)合Jexus + Kestrel 部署 asp.net core 生產(chǎn)環(huán)境
通過Jexus 部署 dotnetcore版本MusicStore 示例程序
ASP.NET Core 中文文檔 第一章 入門
用 Visual Studio Code 在 macOS 上創(chuàng)建首個(gè) ASP.NET Core 應(yīng)用程序
用 Visual Studio 和 ASP.NET Core MVC 創(chuàng)建首個(gè) Web API
用 Visual Studio 發(fā)布一個(gè) Azure 云 Web 應(yīng)用程序
ASP.NET Core MVC 與 Visual Studio 入門
第二章指南(4.2)添加 Controller
DotNet Core 介紹
asp.net core 中間件詳解及項(xiàng)目實(shí)戰(zhàn)
教你實(shí)踐ASP.NET Core Authorization(免看文檔教程)
asp.net core 使用 Redis 和 Protobuf 進(jìn)行 Session 緩存
asp.net core 中間件詳解及項(xiàng)目實(shí)戰(zhàn)
第二章 指南(4.3)添加 View
dotnet core開發(fā)體驗(yàn)之開始MVC
dotnet core 開發(fā)體驗(yàn)之Routing
聊聊ASP.NET Core默認(rèn)提供的這個(gè)跨平臺(tái)的服務(wù)器——KestrelServer
簡(jiǎn)析.NET Core 以及與 .NET Framework的關(guān)系
.NET Core 使用Dapper 操作MySQL
使用 CommandLineApplication 類創(chuàng)建專業(yè)的控制臺(tái)程序
簡(jiǎn)析 .NET Core 構(gòu)成體系
.NET Core也可以使用MongoDB了
.NET Core & ASP.NET Core 1.0在Redhat峰會(huì)上正式發(fā)布
.NET Core:面向未來的開源跨平臺(tái)開發(fā)技術(shù)
微軟說它深愛著Linux,現(xiàn)在它用行動(dòng)證明了
移植.NET Core計(jì)劃,整合各平臺(tái)變得更簡(jiǎn)單了!
ASP.NET Core 介紹
通過幾個(gè)Hello World感受.NET Core全新的開發(fā)體驗(yàn)
ASP.NET Core 運(yùn)行原理剖析1:初始化WebApp模版并運(yùn)行
.NET Core系列 : 1、.NET Core 環(huán)境搭建和命令行CLI入門
Asp.Net Core 發(fā)布和部署( MacOS + Linux + Nginx )
Asp.Net Core 發(fā)布和部署(Linux + Jexus )
學(xué)習(xí)ASP.NET Core,你必須了解無處不在的“依賴注入”
.NET Core應(yīng)用類型(Portable apps & Self-contained apps)
原文地址:http://www.cnblogs.com/vipyoumay/p/5640645.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core 1.0发布:微软开源
- 下一篇: asp.net ajax控件工具集 Au