ASP.NET Core 基础知识

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、RunMap 配置 HTTP 管道。 Use 方法可使管道短路(即不调用 next 请求委托)。 Run 是一种约定,并且某些中间件组件可公开在管道末尾运行的 Run[Middleware] 方法。
  • Map 扩展用作约定来创建管道分支。 Map 基于给定请求路径的匹配项来创建请求管道分支。 如果请求路径以给定路径开头,则执行分支。
  • 内置中间件
描述使用
强制走httpsapp.UseHttpsRedirection();
跨域请求 (CORS)app.AddCors();
  • 自定义中间件
    • 创建类:具有类型为 RequestDelegate 的参数的公共构造函数 名为 InvokeInvokeAsync 的公共方法。 此方法必须:返回 Task。接受类型 HttpContext 的第一个参数。 构造函数和 Invoke/InvokeAsync 的其他参数由依赖关系注入 (DI) 填充
    • 使用: app.UseMiddleware<FirstMiddleware>();
    • 中间件扩展方法:扩展方法通过 IApplicationBuilder 公开中间件 写静态类下静态方法,返回IApplicationBuilder ,然后就可以直接使用app.UseXxx();

缓存、Session

1. 缓存

Asp.Net Core不再支持HttpContext.Cache,转而使用MemoryCache,这是一种服务端内存缓存。使用方式方式非常简单,在StartupConfigureServices方法中注册服务,需要使用的位置注入IMemoryCache对象即可。

除了内存缓存,我们还可以使用Redis等分布式缓存

2. Session

在Asp.Net Core中使用Session需要首先添加对Session的支持,否则会报错Session has not been configured for this application or request

Session使用步骤:

  • 1 ) 注册服务。ConfigureServicesservices.AddSession();
  • 2 ) 注册中间件。Configureapp.UseSession();
  • 3 )使用Session
HttpContext.Session.SetString("userName","Colin");
string userName = HttpContext.Session.GetString("userName")

目前Session默认仅支持存储intstringbyte[]类型,其他复杂类型可以使用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管道

  1. HTTP请求先到达一个叫Kestrel的Web Server。 Kestrel负责接收HTTP请求并把请求内容(字符串流)转化成结构化的数据(HttpContext)供后面的中间件使用。
  2. 中间件(Middleware)是一个对HTTP请求和响应进行处理的组件。什么意思呢?就是中间件会对从上游来的HTTP请求做一定的操作/处理/检查,然后将HTTP请求传给下一个中间件;对从下游回来的HTTP响应做一定的操作/处理,再返回给上一个中间件。当然,中间件也可以忽略对HTTP请求或者HTTP响应的处理而直接传给下一个或返回上一个中间件。比如
    a. 用户认证(Authentication)中间件只检查HTTP请求的用户信息,是合法用户就向后传递HTTP请求;
    b. 日志中间件可以只检查HTTP响应,记录响应内容到日志,然后向前返回该响应;
    中间件还可以处理完请求后直接返回HTTP响应,无需向下传递。比如用户认证中间件找不到合法用户信息,这时会直接返回响应而无须通知后续中间件。
  3. 多个中间件连接在一起就构成了中间件管道Middleware Pipeline),每个中间件负责一个特定职责。每个中间件都需要显式添加到管道中,并且添加的顺序很重要。比方说,如果用户认证中间件被第一个添加到管道,那没有用户信息的HTTP请求都会直接被返回;但是如果它被放到StaticFiles中间件之后,那没有用户信息的HTTP请求访问一个存在的静态文件时,会被StaticFiles中间件处理并返回正确的文件。
    a. ASP.NET Core自带的中间件有用户认证,CORS,Response Compression,Static Files,URL Rewriting等;
    b. 第三方提供的中间件,如生成API文档的Swagger等;
    c. 自己定制的中间件,如检查特定用户信息的定制用户认证中间件等
  4. ASP.NET Core中有一个特殊的“中间件”ASP.NET Core MVCMVC是一个采用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 请求,你可以配置每个请求都接收相同的响应

ConfigureServices 方法

Startup 类能可选地包含一个 ConfigureServices 方法用来配置用于应用程序内的服务

  • ConfigureServices 方法是 Startup 类中的公开方法,通过参数获取一个IServiceCollection 实例并可选地返回 IServiceProvider
  • ConfigureServices 需要在 Configure 之前被调用

    这是因为像 ASP.NET MVC 中的某些功能,需要从 ConfigureServices 中请求某些服务,而这些服务需要在接入请求管道之前先被加入 ConfigureServices

在启动时服务可用

ASP.NET Core 在应用程序启动期间提供了一些应用服务和对象,
可以非常简单地使用这些服务

  • 框架服务和对象

IApplicationBuilder

  • 被用于构建应用程序的请求管道
  • 只可以在 Startup 中的 Configure 方法里使用
  • Request Features

IApplicationEnvironment

  • 提供了访问应用程序属性
    • ApplicationNameApplicationVersion 以及 ApplicationBasePath
  • 可以在 Startup 的构造函数和 Configure 方法中使用

IHostingEnvironment

  • 提供了当前的 EnvironmentNameWebRootPath 以及 Web 根文件提供者
  • Startup构造函数Configure 方法中使用

ILoggerFactory

  • 提供了创建日志的机制
  • 可以在 Startup构造函数Configure 方法中使用

IServiceCollection

  • 当前容器中各服务的配置集合
  • 只可在 ConfigureServices方法中被使用
    • 通过在该方法中配置可使服务在应用程序中可用

总结:

  • Startup Constructor - IApplicationEnvironment - IHostingEnvironment - ILoggerFactory
  • ConfigureServices - IServiceCollection
  • Configure - IApplicationBuilder - IApplicationEnvironment - IHostingEnvironment - ILoggerFactory
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值