ASP.NET Core 2.x
Main
方法调用WebHost.CreateDefaultBuilder
,后者按照生成器模式来创建Web应用程序主机。
WebHostBuilder
上的UseStartup
方法为你的应用指定Startup
类
Startup
类用于定义请求处理管道和配置应用所需的任何服务。Startup
必须是公共类,并包含以下方法
ConfigureServices
定义应用所使用的服务Configure
定义请求管道的中间件在ASP.NET Core,使用中间件来撰写请求管道。ASP.NEt Core中间件在HttpContext
上执行异步逻辑,然后调用序列中的下一个中间件或直接终止请求。
通过在Configure
方法中调用UseXYZ
扩展方法来添加UseXYZ
扩展方法来添加名为“XYZ”的中间件组件
可以将任何基于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
。AddSingleton
项目启动-项目关闭 相当于静态类 只会有一个AddScoped
请求开始-请求结束 在这次请求中获取的对象都是同一个AddTransient
请求获取-(GC回收-主动释放) 每一次获取的对象都不是同一个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();
IApplicationBuilder
公开中间件 写静态类下静态方法,返回IApplicationBuilder
,然后就可以直接使用app.UseXxx();
Asp.Net Core不再支持HttpContext.Cache
,转而使用MemoryCache
,这是一种服务端内存缓存。使用方式方式非常简单,在Startup
的ConfigureServices
方法中注册服务,需要使用的位置注入IMemoryCache
对象即可。
除了内存缓存,我们还可以使用Redis等分布式缓存
在Asp.Net Core中使用Session需要首先添加对Session的支持,否则会报错Session has not been configured for this application or request
。
Session
使用步骤:
ConfigureServices
中services.AddSession()
;Configure
中app.UseSession()
;HttpContext.Session.SetString("userName","Colin");
string userName = HttpContext.Session.GetString("userName")
目前Session
默认仅支持存储int
、string
和byte[]
类型,其他复杂类型可以使用json
序列化后存储字符串。
TempData
也依赖于 Session
,所以也要配置 Session
。
默认Session
为服务器端进程内存储,我们也可以使用Redis
做进程外Session
。
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
请求做一定的操作/处理/检查,然后将HTTP请求传给下一个中间件;对从下游回来的HTTP响应做一定的操作/处理,再返回给上一个中间件。当然,中间件也可以忽略对HTTP请求或者HTTP响应的处理而直接传给下一个或返回上一个中间件。比如Authentication
)中间件只检查HTTP请求的用户信息,是合法用户就向后传递HTTP请求;Middleware Pipeline
),每个中间件负责一个特定职责。每个中间件都需要显式添加到管道中,并且添加的顺序很重要。比方说,如果用户认证中间件被第一个添加到管道,那没有用户信息的HTTP请求都会直接被返回;但是如果它被放到StaticFiles
中间件之后,那没有用户信息的HTTP请求访问一个存在的静态文件时,会被StaticFiles
中间件处理并返回正确的文件。CORS,Response Compression,Static Files,URL Rewriting
等;Swagger
等;MVC
是一个采用Model-View-Controller
模式的开发框架。它被加到中间件管道的末尾,用来处理HTTP
请求的业务逻辑。MVC自身的设计也是管道模式,叫做过滤器管道(Filter Pipeline
),一个过滤器就相当于一个中间件。MVC主要用来:Model Binding
),并且做验证(Model Validation
);Controller,Action method
)上去,这个过程叫路由(Routing
);Action method
都需要)时,首先考虑加过滤器或中间件ASP.NET Core 为你的应用程序提供了处理每个请求的完整控制。Startup
类是应用程序的入口(entry point
)
Startup
类中配置请求管道,该管道将用于处理应用程序的所有请求。Startup
类Startup
类提供了应用程序的入口,而且在所有应用程序中都有 Startup
类,被充当为应用程序的启动点Startup
类是不是定义为public
,如果它符合命名规范,ASP.NET 将继续加载它Startup
类,也不会触发异常,ASP.NET 将基于命名空间选择其中一个Configure
方法Configure
方法用于指定 ASP.NET 应用程序将如何响应每一个 HTTP
请求,你可以配置每个请求都接收相同的响应
Configure
方法必须接受一个 IApplicationBuilder
参数Use 扩展方法
都会把一个 中间件
加入请求管道ConfigureServices
方法Startup
类能可选地包含一个 ConfigureServices
方法用来配置用于应用程序内的服务
ConfigureServices
方法是 Startup
类中的公开方法,通过参数获取一个IServiceCollection
实例并可选地返回 IServiceProvider
ConfigureServices
需要在 Configure
之前被调用
这是因为像 ASP.NET MVC 中的某些功能,需要从
ConfigureServices
中请求某些服务,而这些服务需要在接入请求管道之前先被加入ConfigureServices
中
ASP.NET Core 在应用程序启动期间提供了一些应用服务和对象,
可以非常简单地使用这些服务
IApplicationBuilder
Startup
中的 Configure
方法里使用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