相比之前,AOT在.NET8的第5个预览版有了进一步的实现,给我的感觉是在一步步落地,虽然离生产还很远,但还是能看到希望的。
使用AOT的API项目与传统的Web API项目在模版就作了区分,分别是“asp.net core api”和“asp.net core web api”,命令行创建项目的短名称是api和webapi,api是一个更小,更基础的api模版,是通过WebApplication.CreateSlimBuilder来创建的,包含以下功能:
appsettings.json 和 appsettings.{EnvironmentName}.json 的 JSON 文件配置
用户机密配置
控制台日志记录
日志记录配置
由于AOT不支持反射,所以在代码中有反射的使用或使用三方库有反射时都无法使用AOT方式。那么在API中怎么把一个对象或集合返回给API或从API中接到JSON后怎么转成对象和集合呢?在.NET8的API项目中,使用的方式是源生成器,位于System.Text.Json中,下面看API模版代码理解吧。
using System.Text.Json.Serialization;
using Demo03;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
通过给一个类AppJsonSerializerContext来添加特性[JsonSerializable(typeof(Todo[]))],来替换掉在对象和JSON之间的转换。
同时,AOT类型的项目也不能基于IIS来调试,所以对launchSettings.json作了调整。
下面是官方给出的功能支持力度,相当一部分功能已实现。但一些三方的功能也是需要时间对应的,好饭不怕晚,让我们静候AOT的到来吧。
功能 | 完全支持 | 部分支持 | 不支持 |
---|---|---|---|
gRPC | ✔️完全支持 | ||
最小 API | ✔️部分支持 | ||
MVC | ❌❌ | ||
Blazor Server | ❌❌ | ||
SignalR | ❌❌ | ||
Authentication | ❌(即将推出 JWT) | ||
CORS | ✔️完全支持 | ||
HealthChecks | ✔️完全支持 | ||
HttpLogging | ✔️完全支持 | ||
本地化 | ✔️完全支持 | ||
OutputCaching | ✔️完全支持 | ||
RateLimiting | ✔️完全支持 | ||
RequestDecompression | ✔️完全支持 | ||
ResponseCaching | ✔️完全支持 | ||
ResponseCompression | ✔️完全支持 | ||
Rewrite | ✔️完全支持 | ||
Session | ❌❌ | ||
Spa | ❌❌ | ||
StaticFiles | ✔️完全支持 | ||
WebSockets | ✔️完全支持 |