详解 .Net6 Minimal API 的使用方式

少年击剑更吹箫,剑气箫心一例消。这篇文章主要讲述详解 .Net6 Minimal API 的使用方式相关的知识,希望能为你提供帮助。
随着 .Net6 的发布,微软也改进了对之前 ASP.NET Core 构建方式,使用了新的 Minimal API 模式。以前默认的方式是需要在 Startup 中注册 IOC 和中间件相关,但是在 Minimal API 模式下你只需要简单的写几行代码就可以构建一个 ASP.NET Core的Web 应用,可谓非常的简单,加之配合 c# 的 global using 和 Program 的顶级声明方式,使得 Minimal API 变得更为简洁,不得不说 .NET 团队在 .NET 上近几年下了不少功夫,接下来我们就来大致介绍下这种极简的使用模式。
1. 使用方式使用 Visual Studio 2022 新建的 ASP.NET Core 6 的项目,默认的方式就是 Minimal API 模式,整个 Web 程序的结构看起来更加简单,再i加上微软对 Lambda 的改进,使其可以对 Lambda 参数进行 Attribute 标记,有的场景甚至可以放弃去定义 Controller 类了。
2. 几行代码构建Web程序使用 Minimal API 最简单的方式就是能通过三行代码就可以构建一个 WebApi 的程序,代码如下:


var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World");
app.Run()

是的你没有看错,仅仅这样运行起来就可以,默认监听的 http://localhost:5000 和 https://localhost:5001,所以直接在浏览器输入http://localhost:5000地址就可以看到浏览器输出Hello World字样。
3. 更改监听地址如果你想更改它监听的服务端口,可以使用如下的方式:

var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World");
app.Run("http://localhost:6666")

如果想同时监听多个端口的话,可以使用如下的方式:

var app = WebApplication.Create(args);
app.Urls.Add("http://localhost:6666");
app.Urls.Add("http://localhost:8888");
app.MapGet("/", () => "Hello World");
app.Run()

或者是直接通过环境变量的方式设置监听信息,设置环境变量ASPNETCORE_URLS的值为完整的监听URL地址,这样的话就可以直接省略了在程序中配置相关信息了。

ASPNETCORE_URLS=http://localhost:666

如果设置多个监听的URL地址的话可以在多个地址之间使用分号; 隔开多个值:

ASPNETCORE_URLS=http://localhost:6666; https://localhost:888

如果想监听本机所有Ip地址,可以使用如下方式:

var app = WebApplication.Create(args);
app.Urls.Add("http://*:6666");
app.Urls.Add("http://+:8888");
app.Urls.Add("http://0.0.0.0:9999");
app.MapGet("/", () => "Hello World");
app.Run()

同样的也可以使用添加环境变量的方式添加监听地址:

ASPNETCORE_URLS=http://*:6666; https://+:8888; http://0.0.0.0:999

4. 日志操作日志操作也是比较常用的操作,在Minimal API中微软干脆把它提出来,直接简化了操作,如下所示:

var builder = WebApplication.CreateBuilder(args);
builder.Logging.AddJsonConsole();
var app = builder.Build();
app.Logger.LogInformation("读取到的配置信息:{content}", builder.Configuration.GetSection("consul").Get< ConsulOption> ());
app.Run()

5. 基础环境配置无论我们在之前的.Net Core开发或者现在的.Net6开发都有基础环境的配置,它包括 ApplicationName、ContentRootPath、 EnvironmentName相关,不过在Minimal API中,可以通过统一的方式去配置:

var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
ApplicationName = typeof(Program).Assembly.FullName,
ContentRootPath = Directory.GetCurrentDirectory(),
EnvironmentName = Environments.Staging
});
Console.WriteLine($"应用程序名称: {builder.Environment.ApplicationName}");
Console.WriteLine($"环境变量: {builder.Environment.EnvironmentName}");
Console.WriteLine($"ContentRoot目录: {builder.Environment.ContentRootPath}");
var app = builder.Build()

或者是通过环境变量的方式去配置,最终实现的效果都是一样的。- ASPNETCORE_ENVIRONMENT- ASPNETCORE_CONTENTROOT- ASPNETCORE_APPLICATIONNAME
6. 主机相关设置我们在之前的.Net Core开发模式中,程序的启动基本都是通过构建主机的方式,比如之前的Web主机或者后来的泛型主机,在Minimal API中同样可以进行这些操作,比如我们模拟一下之前泛型主机配置Web程序的方式:

var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureDefaults(args).ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup< Startup> ();
});
var app = builder.Build()

如果只是配置Web主机的话Minimal API还提供了另一种更直接的方式,如下所示:

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseStartup< Startup> ();
builder.WebHost.UseWebRoot("webroot");
var app = builder.Build()

7. 默认容器替换很多时候我们在使用IOC的时候会使用其他三方的IOC框架,比如大家耳熟能详的Autofac,我们之前也介绍过其本质方式就是使用UseServiceProviderFactory中替换容器的注册和服务的提供,在Minimal API中可以使用如下的方式去操作:

var builder = WebApplication.CreateBuilder(args);
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
//之前在Startup中配置ConfigureContainer可以使用如下方式
builder.Host.ConfigureContainer< ContainerBuilder> (builder => builder.RegisterModule(new MyApplicationModule()));
var app = builder.Build()

8. 中间件相关相信大家都已经仔细看过了WebApplication.CreateBuilder(args).Build()通过这种方式构建出来的是一个WebApplication类的实例,而WebApplication正是实现了 IApplicationBuilder接口。所以其本质还是和我们之前使用Startup中的Configure方法的方式是一致的,比如我们配置一个Swagger程序为例:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
//判断环境变量
if (app.Environment.IsDevelopment())
{
//异常处理中间件
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI();
}
//启用静态文件
app.UseStaticFiles();
app.UseAuthorization();
app.MapControllers();
app.Run()

常用的中间件配置还是和之前是一样的,因为本质都是??IApplicationBuilder??的扩展方法,我们这里简单列举一下:
Authentication
认证中间件
??app.UseAuthentication()??
Authorization
授权中间件.
??app.UseAuthorization()??
CORS
跨域中间件.
??app.UseCors()??
Exception Handler
全局异常处理中间件.
??app.UseExceptionHandler()??
Forwarded Headers
代理头信息转发中间件.
??app.UseForwardedHeaders()??
HTTPS Redirection
Https重定向中间件.
??app.UseHttpsRedirection()??
HTTP Strict Transport Security (HSTS)
【详解 .Net6 Minimal API 的使用方式】特殊响应头的安全增强中间件.

    推荐阅读