环境:ASP.NET Core3.1
ASP.NET Core是一个全新的Web开发平台,微软在它上面构建了MVC、SingalR、GRPC、Orleans这样广泛使用的Web框架,我们先以MVC框架为例介绍利用ASP.NET Core构建项目的常见名词。
ASP.NET Core MVC项目文件夹解读
一、什么是泛型主机?
主机是封装应用资源的对象,例如 :依赖关系注入 (DI)、Logging、Configuration、IHostedService
实现。启动主机时,它对它在 DI 容器中找到的 IHostedService 的每个实现调用 IHostedService.StartAsync
。 在 web 应用中,其中一个 IHostedService
实现是启动 HTTP 服务器实现的 web 服务。一个对象中包含所有应用的相互依赖资源的主要原因是生存期管理:控制应用启动和正常关闭。
二、泛型主机的创建、配置
1、主机通常由 Program
类中的代码配置、生成和运行,Program.cs是ASP.NET Core的启动入口文件。 Main
方法可以拆成以下代码:
IHostBuilder hostBuilder = CreateHostBuilder(args);//产生一个IHostBuilder实例hostBuilder ,创建通用主机 IHost host= hostBuilder.Build(); //运行给定操作以初始化主机。 这只能调用一次 host.Run();//运行应用程序并阻止调用线程,直至主机关闭。
2、CreateHostBuilder在创建泛型主机的时候进行了什么样的配置呢?
(1)CreateDefaultBuilder 方法的默认做的操作如下:
(2)ConfigureWebHostDefaults
方法的默认做的操作如下:
-
- 从前缀为
ASPNETCORE_
的环境变量加载主机配置。 - 使用应用的托管配置提供程序将 Kestrel 服务器设置为 web 服务器并对其进行配置。 有关 Kestrel 服务器默认选项,请参阅 ASP.NET Core 中的 Kestrel Web 服务器实现。
- 添加主机筛选中间件。默认情况下,主机筛选中间件处于禁用状态。 要启用该中间件,请在 appsettings.json/appsettings.<EnvironmentName>.json 中定义一个
AllowedHosts
键 。 此值是以分号分隔的不带端口号的主机名列表。 - 如果
ASPNETCORE_FORWARDEDHEADERS_ENABLED
等于true
,则添加转接头中间件。 - 支持 IIS 集成。 有关 IIS 默认选项,请参阅 使用 IIS 在 Windows 上托管 ASP.NET Core。
- 从前缀为
二、Program.cs概要
ASP.NET Core应用程序需要在主机中执行,一个主机必须实现 IHost
接口。主机通常使用 HostBuilder
的实例来创建,该实例构建并返回一个 Host
实例。 Host
引用一个将用于处理请求的服务器Kestrel。主机负责应用程序启动和生命周期的管理。服务器Kestrel负责接受HTTP请求。主机的部分职责还包括确保应用程序服务和服务器Kestrel可用并正确配置。
public static void Main(string[] args) { IHostBuilder hostBuilder = CreateHostBuilder(args); IHost host = hostBuilder.Build();//创建主机 host.Run(); //CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
三、IHostBuilder
HostBuilder 用来构建 Host ,也是我们最先接触的一个类,它提供了如下方法:
1、ConfigureAppConfiguration
通过对 IHostBuilder
调用 ConfigureAppConfiguration 为生成过程和应用程序的其余部分设置配置, 可多次进行调用,并累加结果 。由 ConfigureAppConfiguration
创建的配置可以通过 HostBuilderContext.Configuration 获取以用于后续操作,也可以通过 DI 作为服务获取, 主机配置也会添加到应用配置。
public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }).ConfigureAppConfiguration((h, c) =>//指定应用的配置提供程序 { c.AddJsonFile($"PersonConfig.Development.json", true, true); });
2、ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)
该方法是用来注入服务,我们关注点是参数HostBuilderContext,包含 IHost 上的公共服务的上下文。我们可以通过该参数获取应用程序中的配置信息等。
比如我们的配置信息是在appsettings.json中。
四、Startup.cs
ConfigureServices
用于配置依赖注入以在运行时根据依赖关系创建对象,Configure
用于配置中间件(middleware)以构建请求处理流水线。
1、Configure
在ASP.NET Core 应用程序中Configure
方法用于指定中间件以什么样的形式响应HTTP请求。 Configure 方法是用来配置请求管道的,通常会在这里会注册一些中间件
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles();//添加中间件,允许应用程序提供静态资源。 //请求可以通过如下配置静态文件中间件来访问自定义的静态资源: app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "ProjectStaticFile")), RequestPath = "/StaticFiles" }); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
2、ConfigureServices
ConfigureServices
方法是应用程序运行时将服务添加到容器中
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews();//将控制器的服务添加到指定的IServiceCollection。此方法将不会注册用于页面的服务。
// IOPtions 方式读取自定义的配置,可参考之前梳理的知识 PersonOptions option = new PersonOptions(); Configuration.GetSection("PersonOptions").Bind(option); services.AddSingleton(option); }
五、处理管道(中间件)
1、中间件是一种装配到应用管道以处理请求和响应的软件。
2、管道就是多个中间件构成,当接收到一个请求时,请求会交给管道进行处理,请求从一个中间件的一端进入,从中间件的另一端出来,每个中间件都可以对HttpContext
请求开始和结束进行处理。
3、请求管道中的每个中间件负责调用管道中的下一个中间件,或使管道短路。 当中间件短路时,它被称为“终端中间件” ,因为它阻止中间件进一步处理请求。
4、ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。
(1)每个委托均可在下一个委托前后执行操作。 应尽早在管道中调用异常处理委托,这样它们就能捕获在管道的后期阶段发生的异常。
(2)ASP.NET Core 应用设置了处理所有请求的单个请求委托。 这种情况不包括实际请求管道, 调用单个匿名函数以响应每个 HTTP 请求。
5、以下 Startup.Configure
方法将为常见应用方案添加中间件组件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); // app.UseCookiePolicy(); app.UseRouting(); // app.UseRequestLocalization(); // app.UseCors(); app.UseAuthentication(); app.UseAuthorization(); // app.UseSession(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
-
- 异常/错误处理
- 当应用在开发环境中运行时:
- 开发人员异常页中间件 (UseDeveloperExceptionPage) 报告应用运行时错误。
- 数据库错误页中间件报告数据库运行时错误。
- 当应用在生产环境中运行时:
- 异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。
- HTTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加
Strict-Transport-Security
标头。
- 当应用在开发环境中运行时:
- HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。
- 静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。
- Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例 (GDPR) 规定。
- 用于路由请求的路由中间件 (
UseRouting
)。 - 身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。
- 用于授权用户访问安全资源的授权中间件 (
UseAuthorization
)。 - 会话中间件 (UseSession) 建立和维护会话状态。 如果应用使用会话状态,请在 Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。
- 用于将 Razor Pages 终结点添加到请求管道的终结点路由中间件(带有
MapRazorPages
的UseEndpoints
)。
- 异常/错误处理