ASP.NET Core 2.x
基础
Main方法调用WebHost.CreateDefaultBuilder,后者按照生成器模式来创建Web应用程序主机。
启动
WebHostBuilder上的UseStartup方法为你的应用指定Startup类
Startup类用于定义请求处理管道和配置应用所需的任何服务。Startup必须是公共类,并包含以下方法
ConfigureServices定义应用所使用的服务Configure定义请求管道的中间件
内容根
Web根
依赖关系注入(服务)
中间件
在ASP.NET Core,使用中间件来撰写请求管道。ASP.NEt Core中间件在HttpContext上执行异步逻辑,然后调用序列中的下一个中间件或直接终止请求。
通过在Configure方法中调用UseXYZ扩展方法来添加UseXYZ扩展方法来添加名为“XYZ”的中间件组件
- 静态文件
- 路由
- 身份验证
- 响应压缩中间件
- URL重写中间件
可以将任何基于OWIN的中间件与ASP.NET Core应用结合使用。
Startup 类
- 主机提供
Startup类构造函数可用的某些服务。 应用通过ConfigureServices添加其他服务。 主机和应用服务都可以在Configure和整个应用中使用。 - 使用泛型主机 (
IHostBuilder) 时,只能将以下服务类型注入Startup构造函数:IWebHostEnvironment IHostEnvironment IConfiguration - 应用在开发环境中运行并包含
Startup类和StartupDevelopment类,则使用StartupDevelopment类。 ConfigureServices方法 :可选。在Configure方法配置应用服务之前,由主机调用。其中按常规设置配置选项。将服务添加到服务容器,使其在应用和Configure方法中可用Configure方法:Configure方法用于指定应用响应 HTTP 请求的方式。 可通过将中间件组件添加到IApplicationBuilder实例来配置请求管道。Configure方法可使用IApplicationBuilder,但未在服务容器中注册。 托管创建IApplicationBuilder并将其直接传递到Configure。
ASP.NET Core 依赖注入 (服务)
AddSingleton项目启动-项目关闭 相当于静态类 只会有一个AddScoped请求开始-请求结束 在这次请求中获取的对象都是同一个AddTransient请求获取-(GC回收-主动释放) 每一次获取的对象都不是同一个
ASP.NET Core 中间件 Middleware
- 使用
IApplicationBuilder创建中间件管道 Startup.Configure方法添加中间件组件- 使用
Use、Run和Map配置 HTTP 管道。Use方法可使管道短路(即不调用next请求委托)。Run是一种约定,并且某些中间件组件可公开在管道末尾运行的Run[Middleware]方法。 Map扩展用作约定来创建管道分支。Map基于给定请求路径的匹配项来创建请求管道分支。 如果请求路径以给定路径开头,则执行分支。- 内置中间件
| 描述 | 使用 |
|---|---|
| 强制走https | app.UseHttpsRedirection(); |
| 跨域请求 (CORS) | app.AddCors(); |
- 自定义中间件
- 创建类:具有类型为
RequestDelegate的参数的公共构造函数 名为Invoke或InvokeAsync的公共方法。 此方法必须:返回Task。接受类型HttpContext的第一个参数。 构造函数和Invoke/InvokeAsync的其他参数由依赖关系注入 (DI) 填充 - 使用:
app.UseMiddleware<FirstMiddleware>(); - 中间件扩展方法:扩展方法通过
IApplicationBuilder公开中间件 写静态类下静态方法,返回IApplicationBuilder,然后就可以直接使用app.UseXxx();
- 创建类:具有类型为
缓存、Session
1. 缓存
Asp.Net Core不再支持HttpContext.Cache,转而使用MemoryCache,这是一种服务端内存缓存。使用方式方式非常简单,在Startup的ConfigureServices方法中注册服务,需要使用的位置注入IMemoryCache对象即可。
除了内存缓存,我们还可以使用Redis等分布式缓存
2. Session
在Asp.Net Core中使用Session需要首先添加对Session的支持,否则会报错Session has not been configured for this application or request。
Session使用步骤:
- 1 ) 注册服务。
ConfigureServices中services.AddSession(); - 2 ) 注册中间件。
Configure中app.UseSession(); - 3 )使用Session
HttpContext.Session.SetString("userName","Colin");
string userName = HttpContext.Session.GetString("userName")
目前Session默认仅支持存储int、string和byte[]类型,其他复杂类型可以使用json序列化后存储字符串。
TempData也依赖于 Session,所以也要配置 Session。
默认Session为服务器端进程内存储,我们也可以使用Redis做进程外Session。
HTTP请求的处理流水线 – 理解ASP.NET Core中的管道
理解管道对一个后端开发人员很是重要,可以说这是一种不同于桌面程序开发的编程思维。比方说要检查用户的输入(以参数的形式传入),基于桌面开发的经验,我第一反应会是在每个函数开始处都先调用UserInput.Validate(XXX),如果通不过检查就返回错误信息。听起来挺“正确”的做法,但是在后端开发中这属于不正确的方式。那么ASP.NET Core中怎么做才正确呢?下面就讲讲ASP.NET Core的管道(Pipeline),以及如何用 “管道思维” 来解决这个问题。(本篇属于概念介绍型,不涉及具体实现及代码细节)
Web程序的简单理解就是,浏览器发送一个请求(http request),服务器处理并响应这个请求,并返回给浏览器结果 (http response)。如图1所示

图1 Web程序
那么服务器内部如何处理请求并返回结果?也就是后端程序如何工作的呢?ASP.NET Core采用管道(pipeline)的方式。如图2所示

图2 ASP.NET Core管道
- HTTP请求先到达一个叫Kestrel的Web Server。 Kestrel负责接收HTTP请求并把请求内容(字符串流)转化成结构化的数据(HttpContext)供后面的中间件使用。
- 中间件(Middleware)是一个对HTTP请求和响应进行处理的组件。什么意思呢?就是中间件会对从上游来的
HTTP请求做一定的操作/处理/检查,然后将HTTP请求传给下一个中间件;对从下游回来的HTTP响应做一定的操作/处理,再返回给上一个中间件。当然,中间件也可以忽略对HTTP请求或者HTTP响应的处理而直接传给下一个或返回上一个中间件。比如
a. 用户认证(Authentication)中间件只检查HTTP请求的用户信息,是合法用户就向后传递HTTP请求;
b. 日志中间件可以只检查HTTP响应,记录响应内容到日志,然后向前返回该响应;
中间件还可以处理完请求后直接返回HTTP响应,无需向下传递。比如用户认证中间件找不到合法用户信息,这时会直接返回响应而无须通知后续中间件。 - 多个中间件连接在一起就构成了中间件管道(
Middleware Pipeline),每个中间件负责一个特定职责。每个中间件都需要显式添加到管道中,并且添加的顺序很重要。比方说,如果用户认证中间件被第一个添加到管道,那没有用户信息的HTTP请求都会直接被返回;但是如果它被放到StaticFiles中间件之后,那没有用户信息的HTTP请求访问一个存在的静态文件时,会被StaticFiles中间件处理并返回正确的文件。
a. ASP.NET Core自带的中间件有用户认证,CORS,Response Compression,Static Files,URL Rewriting等;
b. 第三方提供的中间件,如生成API文档的Swagger等;
c. 自己定制的中间件,如检查特定用户信息的定制用户认证中间件等 - ASP.NET Core中有一个特殊的“中间件”,ASP.NET Core MVC。
MVC是一个采用Model-View-Controller模式的开发框架。它被加到中间件管道的末尾,用来处理HTTP请求的业务逻辑。MVC自身的设计也是管道模式,叫做过滤器管道(Filter Pipeline),一个过滤器就相当于一个中间件。MVC主要用来:
a. 从HTTP请求中提取用户的输入信息(字符串)到结构化的模型中(Model Binding),并且做验证(Model Validation);
b. 把HTTP请求发送到恰当的控制器处理方法(Controller,Action method)上去,这个过程叫路由(Routing);
c. 控制器解析请求,做出处理,并生成HTTP响应(如生成HTML页面,生成响应数据等)。
总结
- ASP.NET Core后端程序是管道模式,中间件可自由配置,但顺序很重要;
- ASP.NET Core中编程时,要实现一个和特定业务不相关的功能(并且很多
Action method都需要)时,首先考虑加过滤器或中间件 - 有很多很流行的第三方中间件,找到并配置好恰当的中间件,Asp.net core编程就成功了一大半。
应用程序的启动
ASP.NET Core 为你的应用程序提供了处理每个请求的完整控制。Startup 类是应用程序的入口(entry point)
- 开发人员可以在
Startup类中配置请求管道,该管道将用于处理应用程序的所有请求。
Startup 类
Startup类提供了应用程序的入口,而且在所有应用程序中都有Startup类,被充当为应用程序的启动点- 会存在特定环境的启动类和方法(Working with Multiple Environments)
- ASP.NET 并不关心
Startup类是不是定义为public,如果它符合命名规范,ASP.NET 将继续加载它 - 有多个
Startup类,也不会触发异常,ASP.NET 将基于命名空间选择其中一个
Configure 方法
Configure方法用于指定 ASP.NET 应用程序将如何响应每一个 HTTP 请求,你可以配置每个请求都接收相同的响应
- 更复杂的管道配置可以封装于 中间件(middleware) 之中,并通过扩展方法添加到 IApplicationBuilder 上
Configure方法必须接受一个IApplicationBuilder参数- 每个
Use 扩展方法都会把一个中间件加入请求管道
ConfigureServices 方法
Startup 类能可选地包含一个 ConfigureServices 方法用来配置用于应用程序内的服务
ConfigureServices方法是Startup类中的公开方法,通过参数获取一个IServiceCollection实例并可选地返回IServiceProviderConfigureServices需要在Configure之前被调用这是因为像 ASP.NET MVC 中的某些功能,需要从
ConfigureServices中请求某些服务,而这些服务需要在接入请求管道之前先被加入ConfigureServices中
在启动时服务可用
ASP.NET Core 在应用程序启动期间提供了一些应用服务和对象,
可以非常简单地使用这些服务
- 框架服务和对象
IApplicationBuilder
- 被用于构建应用程序的请求管道
- 只可以在
Startup中的Configure方法里使用 - Request Features
IApplicationEnvironment
- 提供了访问应用程序属性
ApplicationName、ApplicationVersion以及ApplicationBasePath
- 可以在
Startup的构造函数和Configure方法中使用
IHostingEnvironment
- 提供了当前的
EnvironmentName、WebRootPath以及Web 根文件提供者 - 在
Startup的构造函数和Configure方法中使用
ILoggerFactory
- 提供了创建日志的机制
- 可以在
Startup的构造函数或Configure方法中使用
IServiceCollection
- 当前容器中各服务的配置集合
- 只可在
ConfigureServices方法中被使用- 通过在该方法中配置可使服务在应用程序中可用
总结:
- Startup Constructor -
IApplicationEnvironment-IHostingEnvironment-ILoggerFactory- ConfigureServices -
IServiceCollection- Configure -
IApplicationBuilder-IApplicationEnvironment-IHostingEnvironment-ILoggerFactory
本文详细介绍了ASP.NET Core的基础知识,包括WebHostBuilder的使用、Startup类的角色以及ConfigureServices和Configure方法。重点讨论了中间件的概念,如其工作原理、如何创建自定义中间件以及内置中间件的用途。此外,还涵盖了依赖注入的三种模式(Singleton、Scoped、Transient)以及服务注册和使用。最后,文章阐述了HTTP请求处理流水线,强调了管道模式在后端开发中的重要性,并概述了应用程序启动时可用的服务和对象。
655

被折叠的 条评论
为什么被折叠?



