如何将UTC日期传递到Web API?
传递2010-01-01工作正常,但当我通过UTC日期,如2014-12-31T22:00:00.000Z(有时间组件),我得到一个HTTP 404响应。所以
http://domain/api/controller/action/2012-12-31T22:00:00.000Z
产生404错误响应,而
http://domain/api/controller/action/2012-12-31
工作正常。
如何将UTC日期传递到Web API然后 – 或至少指定日期和时间?
解决方法
我感觉你的痛苦…另一个日期时间格式…只是你需要的!
使用Web Api 2,您可以使用路由属性指定参数。
所以使用您的类和您的方法的属性,您可以使用您遇到麻烦的utc格式(显然是它的ISO8601,可能是使用startDate.toISOString()到达)编码一个REST URL,
[Route(@"daterange/{startDate:regex(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$)}/{endDate:regex(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$)}")] [HttpGet] public IEnumerable<MyRecordType> GetByDateRange(DateTime startDate,DateTime endDate)
….但是,虽然这个工作与一个日期(startDate),由于某些原因,它不工作,当endDate是这种格式…调试小时,只有线索是异常说它不喜欢冒号“:”(甚至虽然web.config设置为:
<system.web> <compilation debug="true" targetFramework="4.5.1" /> <httpRuntime targetFramework="4.5.1" requestPathInvalidCharacters="" /> </system.web>
所以,让另一个日期格式(从ISO日期格式的polyfill取得),并将其添加到Javascript日期(为了简洁,只能转换为分钟):
if (!Date.prototype.toUTCDateTimeDigits) { (function () { function pad(number) { if (number < 10) { return '0' + number; } return number; } Date.prototype.toUTCDateTimeDigits = function () { return this.getUTCFullYear() + pad(this.getUTCMonth() + 1) + pad(this.getUTCDate()) + 'T' + pad(this.getUTCHours()) + pad(this.getUTCMinutes()) + 'Z'; }; }()); }
然后,当您将日期发送到Web API 2方法时,可以将它们从字符串转换为日期:
[RoutePrefix("api/myrecordtype")] public class MyRecordTypeController : ApiController { [Route(@"daterange/{startDateString}/{endDateString}")] [HttpGet] public IEnumerable<MyRecordType> GetByDateRange([FromUri]string startDateString,[FromUri]string endDateString) { var startDate = BuildDateTimeFromYAFormat(startDateString); var endDate = BuildDateTimeFromYAFormat(endDateString); ... } /// <summary> /// Convert a UTC Date String of format yyyyMMddThhmmZ into a Local Date /// </summary> /// <param name="dateString"></param> /// <returns></returns> private DateTime BuildDateTimeFromYAFormat(string dateString) { Regex r = new Regex(@"^\d{4}\d{2}\d{2}T\d{2}\d{2}Z$"); if (!r.IsMatch(dateString)) { throw new FormatException( string.Format("{0} is not the correct format. Should be yyyyMMddThhmmZ",dateString)); } DateTime dt = DateTime.ParseExact(dateString,"yyyyMMddThhmmZ",CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal); return dt; }
所以url会的
http://domain/api/myrecordtype/daterange/20140302T0003Z/20140302T1603Z
Hanselman在这里给出一些相关信息:
http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx