您现在的位置是:网站首页> 编程资料编程资料

关于.NET6 Minimal API的使用方式详解_实用技巧_

2023-05-24 316人已围观

简介 关于.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上近几年真是下了不少功夫,接下来我们就来大致介绍下这种极简的使用模式。

使用方式

既然说它很简单了,到底是怎么个简单法呢。相信下载过Visual Studio 2022的同学们已经用它新建过ASP.NET Core 6的项目了,默认的方式就是Minimal API模式,这样让整个Web程序的结构看起来更简单了,加上微软对Lambda的改进使其可以对Lambda参数进行Attribute标记,有的场景甚至可以放弃去定义Controller类了。

几行代码构建Web程序

使用Minimal API最简单的方式就是能通过三行代码就可以构建一个WebApi的程序,代码如下

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

是的你没有看错,仅仅这样运行起来就可以,默认监听的 http://localhost:5000https://localhost:5001,所以直接在浏览器输入http://localhost:5000地址就可以看到浏览器输出Hello World字样。

更改监听地址

如果你想更改它监听的服务端口可以使用如下的方式进行更改

 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:6666

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

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

如果想监听本机所有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:9999

日志操作

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

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

基础环境配置

无论我们在之前的.Net Core开发或者现在的.Net6开发都有基础环境的配置,它包括 ApplicationNameContentRootPath 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

主机相关设置

我们在之前的.Net Core开发模式中,程序的启动基本都是通过构建主机的方式,比如之前的Web主机或者后来的泛型主机,在Minimal API中同样可以进行这些操作,比如我们模拟一下之前泛型主机配置Web程序的方式

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

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

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

默认容器替换

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

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

中间件相关

相信大家都已经仔细看过了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的扩展方法,我们这里简单列举一下

中间件名称描述API
Authentication认证中间件app.UseAuthentication()
Authorization授权中间件.app.UseAuthorization()
CORS跨域中间件.app.UseCors()
Exception Handler全局异常处理中间件.app.UseExceptionHandler()
Forwarded Headers代理头信息转发中间件.app.UseForwardedHeaders()
HTTPS RedirectionHttps重定向中间件.app.UseHttpsRedirection()
HTTP Strict Transport Security (HSTS)特殊响应头的安全增强中间件.app.UseHsts()
Request LoggingHTTP请求和响应日志中间件.app.UseHttpLogging()
Response Caching输出缓存中间件.app.UseResponseCaching()
Response Compression响应压缩中间件.app.UseResponseCompression()
SessionSession中间件app.UseSession()
Static Files静态文件中间件.app.UseStaticFiles(), app.UseFileServer()
WebSocketsWebSocket支持中间件.app.UseWebSockets()

请求处理

我们可以使用WebApplication中的Map{HTTPMethod}相关的扩展方法来处理不同方式的Http请求,比如以下示例中处理Get、Post、Put、Delete相关的请求

 app.MapGet("/", () => "Hello GET"); app.MapPost("/", () => "Hello POST"); app.MapPut("/", () => "Hello PUT"); app.MapDelete("/", () => "Hello DELETE");

如果想让一个路由地址可以处理多种Http方法的请求可以使用MapMethods方法,如下所示

 app.MapMethods("/multiple", new[] { "GET", "POST","PUT","DELETE" }, (HttpRequest req) => $"Current Http Method Is {req.Method}" );

通过上面的示例我们不仅看到了处理不同Http请求的方式,还可以看到Minimal Api可以根据委托的类型自行推断如何处理请求,比如上面的示例,我们没有写Response Write相关的代码,但是输出的却是委托里的内容,因为我们上面示例中的委托都满足Func的形式,所以Minimal Api自动处理并输出返回的信息,其实只要满足委托类型的它都可以处理,接下来咱们来简单一下,首先是本地函数的形式

 static string LocalFunction() => "This is local function"; app.MapGet("/local-fun", LocalFunction);

还可以是类的实例方法

 HelloHandler helloHandler = new HelloHandler(); app.MapGet("/instance-method", helloHandler.Hello); class HelloHandler { public string Hello() { return "Hello World"; } }

亦或者是类的静态方法

 app.MapGet("/static-method", HelloHandler.SayHello); class HelloHandler { public static string SayHello(string name) { return $"Hello {name}"; } }

其实本质都是一

-六神源码网