我的WebAPI v4端点的一个模型有一个NodaTime.Instant类型的字段.模型验证始终报告此失败(Model.IsValid == false),并显示错误消息“意外令牌解析即时.预期字符串,获得日期”.这显然是从
NodaTime开始的.
请求消息实际上将Instant作为包含ISO-8601日期的字符串传递,因此必须在NodaTime获取之前将其解析为BCL DateTime.我尝试使用OffsetDateTime和LocalDateTime,但在每种情况下都有类似的错误.
那我该怎么办?我应该通过Instant以外的其他东西吗?是否有其他方法来处理不会导致此错误的解析或验证?
我在下面加了一个最小的复制品.如果你使用像{“SomeInstant”这样的请求体来POST它会失败:“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; }
}
}
最佳答案 感谢Twitter的乐趣,看起来这只是在Json.NET中禁用自动DateTime处理的问题,例如
[...]JsonFormatter.SerializerSettings.DateParseHandling = DateParseHandling.None
我们可能应该修改配置方法来自动执行此操作…
请注意,这也将禁用“Date(…)”值的处理,因此您需要小心.如果您完全控制了呼叫者,那应该不是问题.