ASP.NET Core 的 WebApplication 类和 WebApplicationBuilder 类

WebApplication 类

ASP.NET Core 有3个 Host 类,是ASP.NET Core中用于初始化,生命周期管理,启动Web 服务的最重要的类。所以详细重点分析一下这几个类,分别是:

  • WebApplicationASP.NET Core 6 引入的替代WebHost的类,可以用于 Web App或者 Web API
  • Host,非 Web App或者Web API 使用的 Host 类,比如纯控制台,或者 Windows Service。
  • WebHostASP.NET Core 6之前的版本使用的Host类。此处不再学习。

2个静态方法

  • CreateBuilder(),用于创建WebApplicationBuilder 对象,再用 Build 模式添加一些中间件,再创建WebApplication对象。
  • Create(),用于直接创建一个WebApplication对象,会默认添加和配置一些中间件。

使用CreateBuilder的例子代码:

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();

直接创建一个WebApplication对象的例子代码:

csharp 复制代码
var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World!");
app.Run();

然后再用 Run()方法启动Web服务。包括 Run(),共有3个方法启动Web服务,区别是:

  • Run(),阻塞当前线程,直到 Host 关闭。
  • RunAsync(),启动 Host 的 Task,只有当 token 或者 shutdown 被触发时才会完成此。
  • StartAsync(),启动 Host的 Task,启动成功后立即返回 Task,然后 HTTP Server 可以接收 HTTP Request 。

其他的扩展方法

  • UseRequestLocalization(),使用 RequestLocalizationMiddleware 中间件,根据客户端的 http 请求自动设置语言。
  • UseAuthentication(),使用 AuthenticationMiddleware 中间件,开启身份验证功能。
  • UseAuthorization(),使用 AuthorizationMiddleware 中间件,开启权限验证功能,必须用于app.UseRouting() 与 app.UseEndpoints(...)之间。
  • UseCertificateForwarding(),验证来自客户端请求的 Header 中的证书,然后更新在HttpContext.Connection.ClientCertificate中。
  • UseConcurrencyLimiter(),使用ConcurrencyLimiterMiddleware 中间件,限制并发请求数。
  • MapConnectionHandler(),将特定路径的请求映射到某个 pipeline。
  • MapConnections(),同上。
  • MapAreaControllerRoute(),为controller映射endpoints,并指定路由。
  • MapControllers(),为controllerr映射endpoints,但不指定路由。
  • MapDefaultControllerRoute(),为controllerr映射endpoints,并使用默认路由{controller=Home}/{action=Index}/{id?}。
  • MapDynamicControllerRoute(),为controllerr映射特定的 Route endpoints
  • MapFallbackToAreaController(),为controllerr映射特定的 Route endpoints
  • UseCookiePolicy(),使用CookiePolicyMiddleware 中间件,开启 Cookie策略功能。
  • UseCors(),使用CORS中间件,开启跨域功能。
  • UseDefaultFiles(),开启默认的文件映射功能。
  • UseDeveloperExceptionPage(),在开发环境下生成 exception 的 htmld页面。
  • UseDirectoryBrowser(),开启目录浏览功能。
  • UseFileServer(),使用静态文件中间件,映射request 路径到我们预设的其他路径,但不包含DirectoryBrowser功能。
  • UseStaticFiles(),使用静态文件中间件。
  • Map(),模式匹配 HTTP 请求,映射到某个endpoint。
  • MapHub(),模式匹配 HTTP 请求,映射到某个Hub。
  • MapDelete(),模式匹配 HTTP Delete请求,映射到某个endpoint。
  • MapGet(),模式匹配 HTTP Get请求,映射到某个endpoint。
  • MapPut(),模式匹配 HTTP Put请求,映射到某个endpoint。
  • MapPost(),模式匹配 HTTP Post请求,映射到某个endpoint。
  • MapGroup(),模式匹配 某个前缀的HTTP 请求,映射到某个endpoint。
  • MapMethods(),模式匹配 某个方法的HTTP 请求,映射到某个endpoint。
  • MapPatch(),模式匹配 HTTP Patch 请求,映射到某个endpoint。
  • MapHealthChecks(),使用某个endpoint提供的HealthChecks功能。
  • UseEndpoints(),使用Endpoints中间件,指定endpoints。
  • UseRouting(),使用路由中间件。
  • UseExceptionHandler(),捕获异常,记录,如果还没有执行 response,则再用预设的另一个 pipeline 执行一次,
  • UseForwardedHeaders(),HTTP代理转发client request 的 header,填充HttpContext。
  • UseHeaderPropagation(),收集header,发给 HttpClient。
  • UseHealthChecks(),使用健康度检查中间件。
  • UseHostFiltering(),过滤 http 请求,无效请求返回400。
  • UseHsts(),使用HSTS,添加Strict-Transport-Security header。
  • UseHttpLogging(),记录 http的 request 和 response。
  • UseW3CLogging(),以 W3C 格式记录 http的 request 和 response。
  • UseHttpMethodOverride(),当限制 client 的 GET或 POST 请求时,可执行其他请求。
  • UseHttpsRedirection(),将 http 请求重定向至 https。
  • UseMigrationsEndPoint(),侦听DefaultPath的请求,然后执行migrations操作。
  • UseMvc(),使用MVC中间件。
  • UseOutputCache(),caching HTTP response。
  • UseResponseCaching(),aching HTTP response。
  • UseOwin(),使用Owin。
  • UseRateLimiter(),限制requests流量。
  • UseRequestDecompression(), 解压缩 HTTP request功能。
  • UseResponseCompression(), 解压缩 HTTP response功能。
  • UseRewriter(),重写某个 url,修改HttpContext。
  • UseRouter(),
  • UseSession(),启用 Session功能。
  • UseSpa(),返回SPA的默认页面。
  • UseSpaStaticFiles(),在 SPA 中使用静态文件。
  • UseStatusCodePages(),当没有 body 时,返回400 and 599。
  • UseMiddleware(),使用自定义中间件。
  • UsePathBase(),提取路径
  • UseWebSockets(),使用WebSockets。
  • UseWelcomePage(),使用WelcomePage。

6个关键属性

  • Configuration,
  • Environment,
  • Lifetime
  • Logger
  • Services
  • Urls

Configuration

可以有以下来源:

  • 命令行参数,
  • 没有ASPNETCORE_ 或者 DOTNET_前缀的环境变量
  • User secrets
  • 配置文件, 比如 appsettings.json
  • Azure Key Vault
  • Azure App Configuration
  • 其他自定义的来源,可以是安装的 installed or created
  • Directory 文件
  • 内存中的 .NET 对象

读取 Configuration:

csharp 复制代码
var app = WebApplication.Create(args);
var message = app.Configuration["HelloKey"] ?? "Config failed!";
app.MapGet("/", () => message);
app.Run();

Environment

Lifetime

Logger

csharp 复制代码
var app = WebApplication.Create(args);
app.Logger.LogInformation("The app started");
app.MapGet("/", () => "Hello World");
app.Run();

Services

Resolve Service

csharp 复制代码
using (var scope = app.Services.CreateScope())
{
    var sampleService = scope.ServiceProvider.GetRequiredService<SampleService>();
    sampleService.DoSomething();
}

Urls

配置默认EndPoint

Visual Studio生成的模板代码,会在 Properties/launchSettings.json 文件中将默认EndPoint设置成 http://localhost:5000

修改监听端口

设置证书

WebApplicationBuilder 类

WebApplicationBuilder 类使用 Build 模式构建WebApplication对象。

设置完WebApplication要用的配置后,调用 Build()方法生成 WebApplication 对象。

6个主要属性

  • Services
  • Environment
  • Configuration
  • Logging
  • Host
  • WebHost

Services

注册使用Service:

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
// Add the memory cache services.
builder.Services.AddMemoryCache();
// Add a custom scoped service.
builder.Services.AddScoped<ITodoRepository, TodoRepository>();
var app = builder.Build();

Environment

修改环境变量:

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
// Configure JSON logging to the console.
builder.Environment.WebRootPath = "webroot";
var app = builder.Build();
app.MapGet("/", () => "Hello JSON console!");
app.Run();

Configuration

获取或者修改配置项:

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddIniFile("appsettings.ini");
var app = builder.Build();

Logging

添加日志 provider

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
// Configure JSON logging to the console.
builder.Logging.AddJsonConsole();
var app = builder.Build();
app.MapGet("/", () => "Hello JSON console!");
app.Run();

Host

自定义 Host的属性

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
// Wait 30 seconds for graceful shutdown.
builder.Host.ConfigureHostOptions(o => o.ShutdownTimeout = TimeSpan.FromSeconds(30));
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();

WebHost

自定义 WebHost 的属性

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
// Change the HTTP server implemenation to be HTTP.sys based
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.MapGet("/", () => "Hello HTTP.sys");
app.Run();
相关推荐
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
Yaml42 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
小码编匠3 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
AskHarries3 小时前
Java字节码增强库ByteBuddy
java·后端
佳佳_3 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
许野平5 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
BiteCode_咬一口代码6 小时前
信息泄露!默认密码的危害,记一次网络安全研究
后端
齐 飞6 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb