asp.net-web-api – 在WebAPI模型中使用NodaTime Instant始终无法通过验证

我的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(…)”值的处理,因此您需要小心.如果您完全控制了呼叫者,那应该不是问题.

点赞