使用 NodaTime LocalDate 调用 Web api POST (abp appservice) 无法序列化

Evr*_* E. 1 .net c# nodatime abp webapi

我正在尝试使用abp.io编写一个 Web api并实现NodaTime。每当我尝试调用 POST 操作时,我都会得到

验证期间检测到以下错误。\r\n - JSON 值无法转换为 NodaTime.LocalDate。

我已经在模块中正确配置了 NodaTime,我还在传统的 .net 5 Web api 中对其进行了测试,并且工作正常。

这是我的配置:

private void ConfigureNodaSerialization()
    {
        Configure<JsonSerializer>(options =>
        {
            options.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
            //options.Converters.Add(NodaConverters.LocalDateConverter);
        });
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用 NodaTime.Serialization.JsonNet

我也尝试过 NodaTime.Serialization.SystemTextJson 无济于事,结果相同。

..这是应用程序服务:

[AllowAnonymous]
public class NodaTestAppService : TestAppService, INodaTestAppService
{
    public Task PostNodaTest([FromBody]NodaTestDto dto)
    {
        return Task.CompletedTask;
    }

    public Task GetNodaTest(NodaTestDto dto)
    {
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

GET 工作正常,问题出在 POST 上。

这是 dto:

public class NodaTestDto
{
    public LocalDate Date { get; set; }
    public string NodaString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑问题出在 Abp 序列化上。

我在 github上有我的测试解决方案。

这是我尝试请求的卷曲:

curl -X 'POST'
'https://localhost:44333/api/app/noda-test/noda-test'
-H '接受:/ '
-H '内容类型:application/json'
-H 'RequestVerificationToken: CfDJ8N-JsQhR2mhIqO-RkZtn61KwWgiFfjD60I0EMA07QTooLF9dC8LPmQEDtTws8MpTUtl8b0gtuE-NAiBAXxHEu8IyU8-4w0MfVB4IeZTRsWwXIgzc7pQYReLYnV1IVp0icR5Aj-fMvBq RyvPaNTgVJBc'
-d '{ "日期": "1991-08-28", "nodaString": "字符串" }'

pfx*_*pfx 5

ABP 的源代码显示Newtonsoft.Json正在配置 MvcNewtonsoftJsonOptions(而不是JsonSerializer):

services.Configure<MvcNewtonsoftJsonOptions>(jsonOptions => { 
    // configuration settings go here.
}
Run Code Online (Sandbox Code Playgroud)

您可能想使用类似的方式进行操作NodaTime.Serialization.JsonNet

private void ConfigureNodaSerialization(ServiceConfigurationContext context)
{
    context.Services.Configure<MvcNewtonsoftJsonOptions>(options =>
    {
        options.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
    });
}
Run Code Online (Sandbox Code Playgroud)

我使用下面的包参考。

<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.0.0" />
Run Code Online (Sandbox Code Playgroud)

更新

文档指出,ABP 正在使用一种混合方法,使用System.Text.Json回退到Newtonsoft.Json不支持的类型;Newtonsoft.Json它展示了如何在特定课程或所有地方继续使用。

我采取的方法仅用于Newtonsoft.Json该类NodaTestDto,以及NodaTime上面显示的配置。

您的ConfigureNodaSerialization方法TestHttpApiHostModule应如下所示。

private void ConfigureNodaSerialization()
{
    // Use Newtonsoft.Json for NodaTestDto.
    Configure<AbpSystemTextJsonSerializerOptions>(options =>
    {
        options.UnsupportedTypes.AddIfNotContains(typeof(NodaTestDto));
    });
    
    // Configure Nodatime (de)serialization.
    Configure<MvcNewtonsoftJsonOptions>(jsonOptions =>
    {
        jsonOptions.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
    });
}
Run Code Online (Sandbox Code Playgroud)

现在,当{ "date": "1991-08-28", "nodaString": "string" } json使用SwaggerUI 发布有效负载时,您NodaTestAppService会收到一个有效的LocalDate实例:

在此输入图像描述