【发布时间】:2014-08-31 01:11:18
【问题描述】:
我正在研究使用 NodaTime LocalDate 来替换我们现有的 BCL DateTime/DateTimeOffset 类的使用。由于我们对 DateTime 可以说是模棱两可的行为的误解,我们的代码遇到了许多与时区相关的问题。
为了充分利用 NodaTime,我希望能够从 YYYY-MM-DD 形式的 ASP.NET Web API 2 Web 服务发送和接收日期。我已成功将 LocalDate 正确序列化为 YYYY-MM-DD。但是我无法将日期查询参数反序列化为 LocalDate。 LocateDate 始终为 1970-01-01。
这是我当前的原型代码(为了清楚起见,删除了一些代码):
PeopleController.cs
[RoutePrefix("api")]
public class PeopleController : ApiController
{
[Route("people")]
public LocalDate GetPeopleByBirthday([FromUri]LocalDate birthday)
{
return birthday;
}
}
Global.asax.cs
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// Web API configuration and services
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
我通过
执行 Web 服务http://localhost/api/people?birthday=1980-11-20
但是,返回的是 1970 年 1 月 1 日。进入代码后,我确认 birthday 设置为 1970-01-01。
如何配置序列化,以便 URL 中指定为查询参数(或路径元素)的日期可以正确序列化为 NodaTime LocalDate?
【问题讨论】:
-
嗯。如果您删除
FromUri部分,我不支持它有帮助,是吗? (我希望它默认为那个,它可能会混淆它......)这看起来更像是一个模型解析问题而不是 Noda Time 问题 - 我的猜测是它根本没有进入 JSON 序列化程序.仅出于诊断目的,您是否尝试过具有birthday类型为LocalDate的属性的包装类,然后将该类用作您的参数类型? -
该 URL 不是 JSON,因此它不会被 JSON.Net 解释,也不会通过 NodaTime 序列化配置。
-
我可以重现这个。除了在正文中发布之外,我还不确定解决方案,但这对于这个请求并不理想。我会深入挖掘。
-
@JonSkeet,删除 FromUri 似乎没有影响。我创建了一个带有单个
LocalDate Birthday属性的BirthdayFacade类,它也被序列化为 1970-01-01。 -
嗯。让我们希望马特能得到某个地方 - 我现在已经超出了我的深度。
标签: c# asp.net-web-api nodatime