ASP.NET Core 应用是在其 Main 方法中创建 Web 服务器的控制台应用:
Main 方法调用 WebHost.CreateDefaultBuilder,通过生成器模式来创建web主机.生成器提供定义 Web 服务器(例如,UseKestrel)和启动类 (UseStartup) 的方法。 在前面的例子中,自动分配了 Kestrel Web 服务器。ASP.NET Core 的 Web 主机尝试在 IIS 上运行(如果可用)。 对于其他 Web 服务器(如 HTTP.sys),可通过调用相应的扩展方法来使用。 在下一节对 UseStartup 进行了更深入的介绍。
IWebHostBuilder 是 WebHost.CreateDefaultBuilder 调用的返回类型,它提供了许多可选方法。 其中的一些方法包括用于在 HTTP.sys 中托管应用的 UseHttpSys ,以及用于指定根内容目录的 UseContentRoot。 Build 和 Run 方法生成 IWebHost 对象,该对象托管应用并开始侦听 HTTP 请求。
WebHostBuilder 提供了许多可选方法,其中包括用于在 IIS 和 IIS Express 中进行托管的 UseIISIntegration,以及用于指定根内容目录的 UseContentRoot。 Build 和 Run 方法生成 IWebHost 对象,该对象托管应用并开始侦听HTTP 请求。
Startup 类用于定义请求处理管道和配置应用所需的任何服务
ConfigureServices 定义应用所使用的服务(如 ASP.NET Core MVC、Entity Framework Core 和标识)。 Configure定义在请求管道中调用的中间件。
public class Startup { // This method gets called by the runtime. Use this method // to add services to the container. public void ConfigureServices(IServiceCollection services) { } // This method gets called by the runtime. Use this method // to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app) { } }
- 内容:如 Razor Pages、MVC 视图和静态资源
- Web根:包含公共资源、CSS 等静态资源、JavaScript 和图形文件。
- 依赖关系注入服务:服务是应用中常用的组件。 可以通过依存关系注入 (DI) 来获取服务。 ASP.NET Core 包括默认支持构造函数注入的本机控制反转 (IoC) 容器。 可根据需要替换默认容器。 DI 除了具备松散耦合优势以外,还可以使服务(例如日志记录)在整个应用中可用。
- 中间件:在 ASP.NET Core 中,使用中间件来撰写请求管道。 ASP.NET Core 中间件在 HttpContext 上执行异步操作,然后调用管道中的下一个中间件或终止请求。按照惯例,通过在 Configure 方法中调用 UseXYZ 扩展方法,向管道添加名为“XYZ”的中间件组件。ASP.NET Core 包含一组丰富的内置中间件,你也可以编写自己的自定义中间件。 ASP.NET Core 应用中支持 .NET的开放 Web 接口 (OWIN),它将 Web 应用与 Web 服务器分离。
- HTTP启动请求:IHttpClientFactory 可访问 HttpClient 实例以发出 HTTP 请求。
- 环境:环境(如“开发”环境和“生产”环境)是 ASP.NET Core 的高级概念,可使用环境变量、设置文件和命令行参数进行设置。
- ASP.NET Core 应用可配置和启动一个主机,负责应用启动和生存期管理。
- 服务器:ASP.NET Core 托管模型不直接侦听请求。 托管模型依赖 HTTP 服务器实现将请求转发到应用。 转发的请求被打包为一组可通过接口进行访问的功能对象。 ASP.NET Core 包含托管的跨平台 Web 服务器,名为 Kestrel。 Kestrel通常在生产 Web 服务器(如反向代理配置中的 IIS 或 Nginx)后台运行。
- 配置:基于名称/值对使用配置模型,不再是system.Configuration和web.config。配置从一组有序的配置提供程序获取设置。 内置配置提供程序支持各种文件格式(XML、 JSON、INI)、环境变量和命令行参数。 也可以编写你自己的自定义配置提供程序。
- 日志记录:ASP.NET Core 支持适用于各种日志记录提供程序的日志记录 API。 内置提供程序支持向一个或多个目标发送日志。 可使用第三方记录框架。
- 错误处理:ASP.NET Core 的内置方案可处理应用中的错误,包括开发人员异常页、自定义错误页、静态状态代码页和启动异常处理。
- 路由
- 文件处理
- 静态文件
- 会话和应用状态:ASP.NET Core 提供几种可在用户浏览 web 应用时保留会话和应用状态的方法。
- 请求功能:与HTTP请求和响应相关的Web服务器实现详细信息在接口中定义,服务器实现和中间件使用这些接口来创建和修改应用的托管管道。
- 后台任务:后台任务作为托管服务实现。 托管服务是一个类,具有实现 IHostedService 接口的后台任务逻辑。
- WebSockets:WebSocket 是一个协议,支持通过 TCP 连接建立持久的双向信道。 它可用于聊天、股票报价和游戏等应用,以及Web 应用中需要实时功能的任何位置。 ASP.NET Core 支持 Web 套接字方案。
Statusup类配置服务和请求管道
Statusup类包括ConfigureServices方法以配置应用的服务.Configure方法以创建应用的请求处理管道
在 Startup 类中注入依赖关系的常见用途为注入:
- IHostingEnvironment 以按环境配置服务。
- IConfiguration 以读取配置。
- ILoggerFactory 以在 Startup.ConfigureServices 中创建记录器。
private readonly IHostingEnvironment _env; private readonly IConfiguration _config; private readonly ILoggerFactory _loggerFactory; public Startup(IHostingEnvironment env, IConfiguration config, ILoggerFactory loggerFactory) { _env = env; _config = config; _loggerFactory = loggerFactory; }
ConfigureServices方法
- Optional
- 在 Configure 方法配置应用服务之前,由 Web 主机调用。
- 其中按常规设置配置选项。
调用所有Add{Service}方法,然后调用所有services.Configure{Service}方法。
将服务添加到服务容器,使其应用和Config方法中可用,这些服务是通过依赖关系注入或IApplicationBuilder.ApplicationServices 解析。
Configure方法
configure方法用于指定应用响应HTTP请求的方式。可通过将中间件组件添加到IApplicationBuilder实例来配置请求管道。Configure 方法可使用 IApplicationBuilder ,但未在服务容器中注册。 托管创建IApplicationBuilder 并将其直接传递到 管道 。
使用Use扩展方法将中间件组件添加到请求管道,
使用Startup筛选器扩展Startup
在应用的 Configure 中间件管道的开头或末尾使用 IStartupFilter 来配置中间件。 IStartupFilter 有助于确保
中间件在应用请求处理管道的开始或结束时由库添加的中间件之前或之后运行
IStartupFilter 实现单个方法(即 Configure),该方法接收并返回 Action<IApplicationBuilder> 。
IApplicationBuilder 定义用于配置应用请求管道的类。 有关详细信息,请参阅使用 IApplicationBuilder 创建中
间件管道。
在请求管道中,每个 IStartupFilter 实现一个或多个中间件。 筛选器按照添加到服务容器的顺序调用。 筛选
器可在将控件传递给下一个筛选器之前或之后添加中间件,从而附加到应用管道的开头或末尾。
IStartupFilter 实现单个方法(即 Configure),该方法接收并返回 Action<IApplicationBuilder> 。
IApplicationBuilder 定义用于配置应用请求管道的类。
IStartupFilter 在 IWebHostBuilder.ConfigureServices 中的服务容器中注册
中间件执行顺序由 IStartupFilter 注册顺序设置:
多个 IStartupFilter 实现可能与相同的对象进行交互。 如果顺序很重要,请将它们的 IStartupFilter 服
务注册进行排序,以匹配其中间件应有的运行顺序。
库可能添加包含一个或多个 IStartupFilter 实现的中间件,这些实现在向 IStartupFilter 注册的其他应
用中间件之前或之后运行。 若要在库的 IStartupFilter 添加中间件之前调用 IStartupFilter 中间件,请
在将库添加到服务容器之前定位服务注册。 若要在此后调用,请在添加库之后定位服务注册。