Tôi cảm thấy nỗi đau của bạn ... nhưng một định dạng ngày giờ khác ... chỉ là những gì bạn cần!
Sử dụng Web Api 2, bạn có thể sử dụng các thuộc tính tuyến đường để chỉ định các tham số.
vì vậy với các thuộc tính trên lớp và phương thức của bạn, bạn có thể mã hóa URL REST bằng định dạng utc này mà bạn đang gặp sự cố (rõ ràng là ISO8601 của nó, có lẽ đã đến khi sử dụng startDate.toISOString ())
[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)
.... NHƯNG, mặc dù điều này hoạt động với một ngày (ngày bắt đầu), vì một số lý do, nó không hoạt động khi ngày cuối cùng ở định dạng này ... đã gỡ lỗi trong nhiều giờ, chỉ có manh mối là ngoại lệ cho biết nó không giống như dấu hai chấm ":" (thậm chí mặc dù web.config được đặt bằng:
<system.web>
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" requestPathInvalidCharacters="" />
</system.web>
Vì vậy, hãy tạo một định dạng ngày khác (được lấy từ polyfill cho định dạng ngày ISO) và thêm nó vào ngày Javascript (nói ngắn gọn, chỉ chuyển đổi tối đa vài phút):
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';
};
}());
}
Sau đó, khi bạn gửi ngày đến phương thức Web API 2, bạn có thể chuyển đổi chúng từ chuỗi thành ngày:
[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);
...
}
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;
}
vì vậy url sẽ là
http://domain/api/myrecordtype/daterange/20140302T0003Z/20140302T1603Z
Hanselman đưa ra một số thông tin liên quan ở đây:
http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx
http://domain/api/controller/action/2012-12-31T22%3A00%3A00.000Z