Ich fühle deinen Schmerz ... noch ein Datum-Zeit-Format ... genau das, was du brauchst!
Mit Web Api 2 können Sie Routenattribute verwenden, um Parameter anzugeben.
Mit Attributen für Ihre Klasse und Ihre Methode können Sie eine REST-URL mit diesem utc-Format codieren, mit dem Sie Probleme haben (anscheinend mit ISO8601, vermutlich mit 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)
.... ABER, obwohl dies mit einem Datum (startDate) funktioniert, funktioniert es aus irgendeinem Grund nicht, wenn das endDate in diesem Format vorliegt ... stundenlang debuggt, nur ein Hinweis ist eine Ausnahme, die besagt, dass es keinen Doppelpunkt ":" (gerade) mag obwohl web.config gesetzt ist mit:
<system.web>
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" requestPathInvalidCharacters="" />
</system.web>
Erstellen Sie also ein anderes Datumsformat (aus der Polyfüllung für das ISO-Datumsformat entnommen) und fügen Sie es dem Javascript-Datum hinzu (der Kürze halber nur bis zu Minuten konvertieren):
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';
};
}());
}
Wenn Sie dann die Daten an die Web API 2-Methode senden, können Sie sie von einer Zeichenfolge in ein Datum konvertieren:
[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;
}
so wäre die url
http://domain/api/myrecordtype/daterange/20140302T0003Z/20140302T1603Z
Hanselman gibt hier einige verwandte Informationen:
http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx
http://domain/api/controller/action/2012-12-31T22%3A00%3A00.000Z