日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

發(fā)布時(shí)間:2023/12/4 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上一節(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()方法獲取配置文件。代碼清單如下:

var builder = new ConfigurationBuilder().SetBasePath(env.ContentRootPath).AddJsonFile("appsettings.json"); ? ? ? ? ? ? ? ? ? ? var configuration = builder.Build(); ? ? ? ? ? ? ? ? ? ? var connStr = configuration.GetSection("Data:DefaultConnection:ConnectionString").Value;

根目錄下的配置文件如下:

{"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)作為日志輸出。

public Startup(IHostingEnvironment env, ILoggerFactory logger) { ? ? ? ? var log = logger.CreateLogger("default");logger.AddConsole();log.LogInformation("start configure");}

2、ConfigureServices

主要實(shí)現(xiàn)了依賴注入(DI)的配置,方法參數(shù)如下:

  • IServiceCollection:整個(gè)ASP.NET Core 默認(rèn)帶有依賴注入(DI),IServiceCollection是依賴注入的容器,首先創(chuàng)建一個(gè)類(Foo)和接口(IFoo),代碼清單如下:

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace WebApplication1{ ? public interface IFoo{ ? ? ? ?string GetFoo();} } using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace WebApplication1{ ? ?public class Foo : IFoo{ ? ? ? ?public string GetFoo() ? ? ? ?{ ? ? ? ? ? ?return "foo";}} }

在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。

public void Configure(IApplicationBuilder app){app.Run((context) => context.Response.WriteAsync("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è)方法的定義。

public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware); public static void Run(this IApplicationBuilder app, RequestDelegate handler);

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ù)指定為如下代碼:

app.Map("/admin", builder =>{builder.Use((context, next) => context.Response.WriteAsync("admin"));});

2、常用中間件

Middleware功能描述
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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。