나는 당신의 고통을 느낍니다 ... 또 다른 날짜 시간 형식 ... 당신이 필요로하는 것!
Web Api 2를 사용하면 경로 속성을 사용하여 매개 변수를 지정할 수 있습니다.
따라서 클래스 및 메서드의 속성을 사용하여 문제가있는이 utc 형식을 사용하여 REST URL을 코딩 할 수 있습니다 (분명히 ISO8601, 아마도 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)
....하지만 이것은 하나의 날짜 (startDate)로 작동하지만 어떤 이유로 endDate가이 형식이면 작동하지 않습니다. 몇 시간 동안 디버깅되었지만 단서 만 예외는 콜론 ":"을 좋아하지 않는다고 말합니다. web.config가 다음으로 설정되어 있지만
<system.web>
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" requestPathInvalidCharacters="" />
</system.web>
따라서 다른 날짜 형식 (ISO 날짜 형식의 폴리 필에서 가져옴)을 만들고이를 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);
...
}
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
http://domain/api/controller/action/2012-12-31T22%3A00%3A00.000Z