Vorbei DateTimeOffset als WebAPI-Abfrage-string
Ich habe eine WebAPI Aktion, die sieht so aus:
[Route("api/values/{id}")]
public async Task<HttpResponseMessage> Delete(string id, DateTimeOffset date) {
//do stuff
}
Aber wenn ich das aufrufen dieses von einem HttpClient
Instanz, sodass eine URL wie:
string.Format("http://localhost:1234/api/values/1?date={0}", System.Net.WebUtility.UrlEncode(DateTimeOffset.Now.ToString()));
//-> "http://localhost:1234/api/values/1?date=17%2F02%2F2015+7%3A18%3A39+AM+%2B11%3A00"
Bekomme ich eine 400
Antwort zurück zu sagen, dass die non-nullable-parameter date
existiert nicht.
Habe ich auch versucht, indem die [FromUri]
- Attribut auf den parameter, aber es immer noch nicht anzeigen durch. Wenn ich es ändern zu sein DateTimeOffset?
ich es sehen kann, ist Links als null und betrachten Request.RequestUri.Query
der Wert ist da, nur nicht abgebildet.
Schließlich versuchte ich nicht tun, eine WebUtility.UrlEncode
und es machte es nicht anders.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem wird genau beschrieben, die durch die 400-response-Nachricht, obwohl es hätte mehr klar. Die route, definiert durch die attribute, die nur einen parameter erwartet, id, aber die Delete-Methode erwartet einen weiteren parameter namens Datum.Möchten Sie, dass dieser Wert mit der query-string, den Sie brauchen, um, dass die parameter nullable, durch die Verwendung von "DateTimeOffset?", das würde auch die Umwandlung in einen optionalen parameter. Wenn das Datum ist ein Pflichtfeld, sollten Sie erwägen, es auf die route, wie:
OK, ignorieren, was schrieb ich oben, es ist nur ein Formatierungs-problem. Web-API hat Probleme, herauszufinden, die Kultur benötigt, um eine Analyse der VORGEGEBENE Wert, aber wenn Sie versuchen, pass auf DateTimeOffset mit einem JSON-format in der Abfrage-string, wie 2014-05-06T22:24:55Z, das sollte funktionieren.
Antwort
Senden Sie eine
DateTimeOffset
zu der API ist, formatieren Sie Sie wie das nach dem umwandeln in UTC:2017-04-17T05:04:18.070Z
Die komplette API-URL wird so Aussehen:
http://localhost:1234/api/values/1?date=2017-04-17T05:45:18.070Z
Ist es wichtig, zuerst konvertieren Sie die DateTimeOffset UTC, weil, wie @OffHeGoes Punkte aus in den Kommentaren, die
Z
am Ende der Zeichenfolge gibt Zulu-Zeit (besser bekannt als UTC).- Code
Können Sie
.ToUniversalTime().ToString(yyyy-MM-ddTHH:mm:ss.fffZ)
zu analysieren, die DateTimeOffset.Um sicherzustellen, dass Ihre DateTimeOffset ist formatiert mit der richtigen Zeitzone immer verwenden
.ToUniversalTime()
zuerst konvertieren Sie dieDateTimeOffset
Wert in UTC, weil dieZ
am Ende der Zeichenkette anzeigt, UTC, auch bekannt als "Zulu-Zeit".yyyy-MM-ddTHH:mm:ss.fffZ
zwingt das Datum formatiert als Zeichenfolge ohne timezone offset...das ist schön, in diesem Beispiel, denn der Wert istDateTimeOffset.UtcNow
aber wenn Sie auf eine nicht-UTC-Wert, dann wird dieses format nicht darstellen, das tatsächliche Datum.Erstellen Sie einen benutzerdefinierten Typ Konverter wie folgt:
In der startup-Sequenz, wie
WebApiConfig.Register
fügen Sie diese Art Konverter dynamisch an dieDateTimeOffset
struct:Können Sie jetzt einfach
DateTimeOffset
Werte in der kompakten form nach ISO8601, die lässt Bindestriche und Doppelpunkte, die stören die URL:Beachten Sie, dass wenn Sie in Bruchteilen von Sekunden, müssen Sie möglicherweise gehören ein trailing slash in der url.
Könnte man es auch in der querystring, wenn Sie mögen:
DateTimeOffsetConverter
, und dann das hinzufügen der Zeileinput = Uri.UnescapeDataString(str);
Um dies zu erreichen, bin ich mit
Verwendung der ISO-8601 - datetime-format Planer:
oder
Die aktuelle akzeptierte Antwort ist, wirft Sie Weg, die time zone-Informationen, die in einigen Fällen wichtig ist. Die folgenden unterhält die Zeitzone und verliert keine Präzision. Es hält auch Ihre code lapidar, wenn Sie eine Abfrage erstellen string.
Beste Weg um herauszufinden, ist zu Fragen, auf die WebAPI zu generieren, die erwartete URL-format selbst:
Beim Aufruf von /- offset aus der Antwort liefert einen 302 auf eine url enthält, die 'date' - parameter im querystring.
Es wird in etwa so Aussehen:
Konnte ich nicht finden, eine überlastung des DateTimeOffset.ToString() generiert einen string-Wert in diesem format, außer für den explizit definieren das format in einen string-format:
Hoffe, das hilft.
Hier ist die einfachste Möglichkeit für diejenigen, die für eine Art sync zwischen client und server mithilfe von datetime. Ich habe implementiert, dass für die mobile Anwendung. Es ist unabhängig von der Kultur des Kunden. da meine mobile app unterstützt mehrere Kulturen und es ist langweilig, Formatierung zwischen diesen Kulturen. vielen Dank, dass .net hat eine perfekte Funktionen aufgerufen
ToFileTime
undFromFileTime
Server-Controller-Action:
Client-Seite
DateTime.Now.ToFileTime()
gibt einen long-integer. Sie können nicht zuweisen, ein long-integer, um einenDateTimeOffset
- das wird nicht kompilieren. Ich denke, du meintest einelong
statt einerDateTimeOffset
auf der client-Seite.DateTimeOffset.FromFileTime
Funktion wandeln Sie auf den local Zeit-zone, da schafft es dieDateTimeOffset
Objekt. Also wenn server und client nicht in derselben Zeitzone befinden, haben Sie unterschiedliche Darstellungen.