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

Calling Web api POST (abp appservice) with a NodaTime LocalDate fails to serialize

我正在尝试使用 abp.io and implementing NodaTime 编写网页 api。 每当我尝试调用 POST 操作时,我都会得到

The following errors were detected during validation.\r\n - The JSON value could not be converted to NodaTime.LocalDate.

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

这是我的配置:

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

我正在使用 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;
    }
}

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

这是 dto:

public class NodaTestDto
{
    public LocalDate Date { get; set; }
    public string NodaString { get; set; }
}

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

我在 github here.

上有我的测试解决方案

这是我尝试请求的卷曲:

curl -X 'POST'
'https://localhost:44333/api/app/noda-test/noda-test'
-H 'accept: /'
-H 'Content-Type: application/json'
-H 'RequestVerificationToken: CfDJ8N-JsQhR2mhIqO-RkZtn61KwWgiFfjD60I0EMa07QTooLF9dC8LPmQEDtTws8MpTUtl8b0gtuE-NAiBAXxHEu8IyU8-4w0MfVB4IeZTRsWwXIgzc7pQYReLYnV1IVp0icR5Aj-fMvBqRyvPaNTgVJBc'
-d '{ "date": "1991-08-28", "nodaString": "string" }'

ABP 的 source code 显示 Newtonsoft.Json 是在 MvcNewtonsoftJsonOptions 上配置的(而不是 JsonSerializer):

services.Configure<MvcNewtonsoftJsonOptions>(jsonOptions => { 
    // configuration settings go here.
}

您可能想以类似的方式使用 NodaTime.Serialization.JsonNet

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

我使用下面的包参考。

<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.0.0" />

更新

documentation 声明 ABP 正在使用混合方法,使用 System.Text.Json 并回退到 Newtonsoft.Json 来处理不受支持的类型;它展示了如何针对特定的 class 或整个地方继续使用 Newtonsoft.Json

我采用的方法是仅将 Newtonsoft.Json 用于 NodaTestDto class,以及上面显示的 NodaTime 配置。

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

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);
    });
}

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