您现在的位置是:网站首页> 编程资料编程资料
关于.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:5000 和 https://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开发都有基础环境的配置,它包括 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_ENVIRONMENTASPNETCORE_CONTENTROOTASPNETCORE_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 Redirection | Https重定向中间件. | app.UseHttpsRedirection() |
| HTTP Strict Transport Security (HSTS) | 特殊响应头的安全增强中间件. | app.UseHsts() |
| Request Logging | HTTP请求和响应日志中间件. | app.UseHttpLogging() |
| Response Caching | 输出缓存中间件. | app.UseResponseCaching() |
| Response Compression | 响应压缩中间件. | app.UseResponseCompression() |
| Session | Session中间件 | app.UseSession() |
| Static Files | 静态文件中间件. | app.UseStaticFiles(), app.UseFileServer() |
| WebSockets | WebSocket支持中间件. | 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}"; } }其实本质都是一
相关内容
- .NET内存泄漏分析Windbg项目实例_实用技巧_
- .net 6精简版webapi教程及热重载、代码自动反编译演示_基础应用_
- .Net性能测试框架Crank的使用方法_基础应用_
- ASP.NET 使用 Dispose 释放资源的四种方法详细介绍_实用技巧_
- .NET Core读取配置文件的方法_基础应用_
- ASP.NET在VS2022中使用Dispose释放资源实例_基础应用_
- .NET HttpClient简单使用教程_实用技巧_
- .NET程序性能监控系统Elastic AMP的使用方法_实用技巧_
- .NET 6线程池ThreadPool实现概述_自学过程_
- System.Diagnostics.Metrics .NET 6 全新指标API讲解_基础应用_
