我的WebAPI v4端点的一个模型有一个NodaTime.Instant
类型的字段。模型验证始终报告此失败(Model.IsValid == false
),并显示错误消息“意外令牌解析即时。预期字符串,获得日期”。这显然来自NodaTime。
请求消息实际上将Instant
作为包含ISO-8601日期的字符串传递,因此必须在NodaTime获取之前将其解析为BCL DateTime
。我尝试使用OffsetDateTime
和LocalDateTime
,但在每种情况下都遇到了类似的错误。
那我该怎么办?我应该通过Instant
以外的其他内容吗?是否有其他方法来处理不会导致此错误的解析或验证?
我在下面加了一个最小的复制品。如果您使用{"SomeInstant":"2013-08-13T17:51:22.1705292Z"}
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using NodaTime;
namespace TestProject.Controllers
{
/** Assume that we called GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Bcl) in Global.asax.cs **/
public class NodaTimeController : ApiController
{
public Instant Post(TestModel m)
{
//ModelState.IsValid is always false due to error parsing the Instant field
if (!ModelState.IsValid)
{
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
}
return m.SomeInstant;
}
}
public class TestModel
{
public Instant SomeInstant { get; set; }
}
}
答案 0 :(得分:2)
感谢Twitter的欢乐,看起来这只是在Json.NET中禁用自动DateTime处理的问题,例如。
[...]JsonFormatter.SerializerSettings.DateParseHandling = DateParseHandling.None
我们可能会修改配置方法来自动执行此操作...
请注意,还会禁用"Date(...)"
值的处理,因此您需要小心。如果你当然完全控制了来电者,那应该不是问题。