ฉันรู้สึกถึงความเจ็บปวดของคุณ ... ยังมีรูปแบบวันเวลาอื่น ... สิ่งที่คุณต้องการ!
การใช้ Web Api 2 คุณสามารถใช้คุณลักษณะเส้นทางเพื่อระบุพารามิเตอร์
ดังนั้นด้วยแอตทริบิวต์ในคลาสและวิธีการของคุณคุณสามารถเขียนโค้ด REST URL โดยใช้รูปแบบ utc นี้คุณกำลังมีปัญหา (เห็นได้ชัดว่าเป็น 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>
ดังนั้นให้สร้างรูปแบบวันที่อื่น (นำมาจาก polyfill สำหรับรูปแบบวันที่ 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