.NET 8 Source Generator序列化FastEndpoints输出为空求助
.NET 8 + FastEndpoints 中Source Generator序列化输出为空对象的问题
我正在开发API测试功能,采用.NET 8 + FastEndpoints框架,尝试通过Source Generator实现API输入输出的JSON序列化。目前输入序列化正常工作,但输出始终返回空值{}。
以下是相关代码:
WeatherForecastController.cs
public class WeatherForecastController : Endpoint<DtoIn, DtoOut> { public override void Configure() { Post("/test"); Description(b => b.Produces(200)); AllowAnonymous(); } public override async Task HandleAsync(DtoIn req, CancellationToken ct) { await SendOkAsync(new DtoOut() { Surname = req.Name + "Teste" }, ct); } } public class DtoIn { public string Name { get; set; } } public class DtoOut { public string Surname { get; set; } }
Program.cs
using FastEndpoints; using FastEndpoints.Swagger; using WebApplication1; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddFastEndpoints(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.UseFastEndpoints( c => { c.Serializer.Options.TypeInfoResolver = SourceGenerator.Default; }); app.UseSwaggerGen(); app.MapControllers(); app.Run();
SourceGenerator.cs
using System.Text.Json.Serialization; using WebApplication1.Controllers; namespace WebApplication1 { [JsonSerializable(typeof(DtoIn))] [JsonSerializable(typeof(DtoOut))] [JsonSourceGenerationOptions( WriteIndented = true, GenerationMode = JsonSourceGenerationMode.Default, PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase )] internal partial class SourceGenerator : JsonSerializerContext { } }
project.csproj
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <GenerateDocumentationFile>true</GenerateDocumentationFile> <JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault> <EnableConfigurationBindingGenerator>true</EnableConfigurationBindingGenerator> <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator> </PropertyGroup> <ItemGroup> <PackageReference Include="FastEndpoints" Version="5.30.0" /> <PackageReference Include="FastEndpoints.Swagger" Version="5.30.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" /> </ItemGroup> </Project>
我已经尝试解决这个问题三天但未成功,请问问题出在哪里?
解决方案
问题出在FastEndpoints序列化配置时机错误和Nullable启用后的属性未初始化,具体修复步骤如下:
调整序列化配置的位置
FastEndpoints的序列化器在服务注册阶段初始化,后续在UseFastEndpoints中修改选项不会生效。需要把序列化配置移到AddFastEndpoints服务注册环节,修改Program.cs:builder.Services.AddFastEndpoints(c => { c.Serializer.Options.TypeInfoResolver = SourceGenerator.Default; });同时删除
app.UseFastEndpoints中的配置代码,仅保留app.UseFastEndpoints();。初始化Nullable模式下的属性
项目启用了<Nullable>enable</Nullable>,未初始化的字符串属性可能被序列化器判定为不可空但未赋值,导致被忽略。给Dto的属性添加默认初始化:public class DtoIn { public string Name { get; set; } = string.Empty; } public class DtoOut { public string Surname { get; set; } = string.Empty; }确认Source Generator的类型引用
确保SourceGenerator.cs能正确访问DtoIn和DtoOut,当前代码中的using WebApplication1.Controllers;需与Dto的实际命名空间匹配,若Dto不在该命名空间,需调整using语句。
完成上述修改后重新编译运行,输出序列化即可正常返回预期内容。
内容的提问来源于stack exchange,提问作者Gabriel Marcilio
相关产品推荐
相关产品推荐

