You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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启用后的属性未初始化,具体修复步骤如下:

  1. 调整序列化配置的位置
    FastEndpoints的序列化器在服务注册阶段初始化,后续在UseFastEndpoints中修改选项不会生效。需要把序列化配置移到AddFastEndpoints服务注册环节,修改Program.cs:

    builder.Services.AddFastEndpoints(c =>
    {
        c.Serializer.Options.TypeInfoResolver = SourceGenerator.Default;
    });
    

    同时删除app.UseFastEndpoints中的配置代码,仅保留app.UseFastEndpoints();。

  2. 初始化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;
    }
    
  3. 确认Source Generator的类型引用
    确保SourceGenerator.cs能正确访问DtoIn和DtoOut,当前代码中的using WebApplication1.Controllers;需与Dto的实际命名空间匹配,若Dto不在该命名空间,需调整using语句。

完成上述修改后重新编译运行,输出序列化即可正常返回预期内容。


内容的提问来源于stack exchange,提问作者Gabriel Marcilio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:16:21