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
public static class ServiceExtensions
{
public static void ConfigureCors(this IServiceCollection service) =>
service.AddCors(options =>
{
options.AddPolicy("CorsPolicy", builder =>
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
}
1.6 Additional Code in the Program Class
-
AddControllers()
,它只会将Controller注册到IServiceCollection
中,而没有Views或者Pages,因为在WebAPI中不需要 -
var app = builder.Build();
在这个方法之后,我们得到了WebApplication
,这个类非常重要,因为它实现很多接口: -
MapControllers()
方法,添加来自controller actions的endpoints到IEndpointRouteBuilder
1.7 Environment-Based Settings
需要区分development
和production
环境变量,因为在不同环境,它们的地址、端口、密码、数据库等都不一样
所以我们需要将它们分割开,所以就有了项目创建时的两个配置文件
appsettings.json
appsetings.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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。