Ultimate ASP.NET CORE 6.0 Web API --- 读书笔记(1)
Project Configuration
本文内容来自书籍: Marinko Spasojevic - Ultimate ASP.NET Core Web API - From Zero To Six-Figure Backend Developer (2nd edition)
需要本书和源码的小伙伴可以留下邮箱,有空看到会发送的
1.2 launchSettings.json File Configuration
- launchBrowser:在项目启动时,是否自动打开浏览器
- launchUrl:项目启动时,自动打开浏览器后的指向url,也就是
applicationUrl/launchUrl - applicationUrl:项目启动的绑定地址,创建时有加密和不加密两个地址
1.3 Program.cs Class Explanations
与.NET 5相比较,这个文件的变化在
- 顶级语句,配置语句只需要直接编写,其他的命名空间、类、入口方法由编译器生成
- 隐式使用指令,编译器根据项目类型自动添加一组
global using指令,如果不需要隐式指令,可以在.csproj文件中配置关闭
<ImplicitUsings>disable</ImplicitUsings> - 不需要
Startup文件的ConfigureServices和Configure配置,已经在全部合并在Program.cs中
var builder = WebApplication.CreateBuilder(args);
这个builder的类型是WebApplicationBuilder,然后这个类主要负责
- 使用
builder.Configuration添加项目配置 - 使用
builder.Services注册服务 - 使用
builder.Logging配置日志系统 - 还有一些
IHostBuilder和IWebHostBuilder的配置
var builder = WebApplication.CreateBuilder(args);
// 注册服务
var app = builder.Build();
// 注册中间件
1.4 扩展方法和CORS配置
在注册服务的时候,往往会有很多配置,那么为了让Program.cs这个文件看起来比较整洁,我们可以给WebApplicationBuilder编写扩展方法,来替代直接写在Program.cs的配置
然后是写一个跨域配置为例子(一般我会用Nginx来解决跨域)
-
首先是创建一个静态类用以编写扩展方法
Extensions/ServiceExtensions.cs -
然后在里面注册服务
// Extensions/ServiceExtensions.cs
public static class ServiceExtensions
{
public static void ConfigureCors(this IServiceCollection service) =>
service.AddCors(options =>
{
options.AddPolicy("CorsPolicy", builder =>
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
}
- 现在,服务器允许所有的主机访问,当然也可以用
WithOrigins()方法来指定主机地址,使用WithMethods()指定HTTP方法,`WithHeaders()指定请求头
1.6 Additional Code in the Program Class
-
AddControllers(),它只会将Controller注册到IServiceCollection中,而没有Views或者Pages,因为在WebAPI中不需要 -
var app = builder.Build();在这个方法之后,我们得到了WebApplication,这个类非常重要,因为它实现很多接口:IHost,开启,关闭主机IApplicationBuilder,用来构建中间件管道IEndpointRouteBuilder,用来添加端点到我们的app中
-
UseHttpRedirection()方法,添加一个中间件用来将HTTP转发到HTTPS中 -
UseAuthorization()方法,添加一个中间件用来授权 -
MapControllers()方法,添加来自controller actions的endpoints到IEndpointRouteBuilder -
Run()方法,启动应用并阻塞直到Host关闭
微软官网提示,添加中间件的顺序很重要
1.7 Environment-Based Settings
需要区分development和production环境变量,因为在不同环境,它们的地址、端口、密码、数据库等都不一样
所以我们需要将它们分割开,所以就有了项目创建时的两个配置文件
appsettings.jsonappsetings.Development.json(这里的配置会覆盖上面那个文件的配置)
appsettings.{EnvironmentSuffix}.json文件会把appsettings.json的配置覆盖
通过ASPNETCORE_ENVIRONMENT这个环境变量来设置使用哪一个配置文件
1.8 ASP.NET Core Middleware
其实中间件可以认为是一个代码区域环绕在requests和responses外围
然后按照注册的顺序,不断调用next方法向下传递,直到一个中间件不再调用即终点
添加自定义的中间件,有两种:
Run:没有next方法,它总是终点,这个方法接受一个RequestDelegate类型的委托,这个委托的入参是HttpContext,它里面包含着requests和responses,然后可以通过修改它们来达到我们的目的Use:链接多个中间件,它接受Func委托,两个入参,一个出参,第二个Func是到达下个中间件的方法
public static IApplicationBuilder Use(this IApplicationBuilder app,Func<HttpContext, Func<Task>, Task> middleware);
不能在Use中,写入了
responses然后继续调用next,这样会报错
Map:作为管道的分支,请求经过这里的时候,会匹配路径,如果正确,会走向这个分支的中间件管道
public static IApplicationBuilder Map(this IApplicationBuilder app,PathString pathMatch, Action<IApplicationBuilder> configuration)
MapWhen:也是管道分支,不过不是使用路径匹配,而是一个predicate判断是否进入
public static IApplicationBuilder MapWhen(this IApplicationBuilder app, Func<HttpContext, bool> predicate, Action<IApplicationBuilder> configuration)

浙公网安备 33010602011771号