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": "字符串" }'
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实例: