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
实例并可选地返回IServiceProvider
ConfigureServices
需要在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