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