在WebAPI模型中使用NodaTime Instant始终无法通过验证

时间:2013-08-13 18:45:03

标签: asp.net-web-api json.net nodatime

我的WebAPI v4端点的一个模型有一个NodaTime.Instant类型的字段。模型验证始终报告此失败(Model.IsValid == false),并显示错误消息“意外令牌解析即时。预期字符串,获得日期”。这显然来自NodaTime

请求消息实际上将Instant作为包含ISO-8601日期的字符串传递,因此必须在NodaTime获取之前将其解析为BCL DateTime。我尝试使用OffsetDateTimeLocalDateTime,但在每种情况下都遇到了类似的错误。

那我该怎么办?我应该通过Instant以外的其他内容吗?是否有其他方法来处理不会导致此错误的解析或验证?

我在下面加了一个最小的复制品。如果您使用{"SomeInstant":"2013-08-13T17:51:22.1705292Z"}

之类的请求正文对其进行POST,则会失败
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; }
    }
}

1 个答案:

答案 0 :(得分:2)

感谢Twitter的欢乐,看起来这只是在Json.NET中禁用自动DateTime处理的问题,例如。

[...]JsonFormatter.SerializerSettings.DateParseHandling = DateParseHandling.None

我们可能会修改配置方法来自动执行此操作...

请注意,会禁用"Date(...)"值的处理,因此您需要小心。如果你当然完全控制了来电者,那应该不是问题。