Ich habe diese kleine ServiceStack-Nachricht:
[Route("/server/time", "GET")]
public class ServerTime : IReturn
{
public DateTimeOffset DateTime { get; set; }
public TimeZoneInfo TimeZone { get; set; }
}
Und der entsprechende Service-Handler sieht wie folgt aus:
public object Get(ServerTime request)
{
return new ServerTime
{
DateTime = DateTimeOffset.Now,
TimeZone = TimeZoneInfo.Local,
};
}
Der Client-Testcode sieht so aus:
var client = new JsonServiceClient("http://localhost:54146/");
var response = client.Get(new ServerTime());
Aber response.TimeZoneInfo ist IMMER leer...
Auch die Metadaten für den Service (JSON) zeigen es nicht an:
(Beispiel-Anfrage in der JSON-Metadaten-Seite)
POST /json/reply/ServerTime HTTP/1.1
Host: localhost
Content-Type: application/json
Content-Length: length
{"DateTime":"\/Date(-62135596800000)\/"}
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: length
{"DateTime":"\/Date(-62135596800000)\/"}
Die XML- und CSV-Formate hingegen scheinen es richtig zu verarbeiten:
POST /xml/reply/ServerTime HTTP/1.1
Host: localhost
Content-Type: application/xml
Content-Length: length
0001-01-01T00:00:00Z
0
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: length
0001-01-01T00:00:00Z
0
Warum frage ich das, anstatt den "XML-Client" zu verwenden?
Das geht um die Konsistenz. Wenn die API nicht über alle möglichen Clients konsistent ist, kann man sich nicht darauf verlassen! Ich müsste entweder den JSON-Formatter fallen lassen (was ich nicht tun kann, weil ich ihn in JavaScript verwenden möchte) oder ich müsste die vielen TimeZoneInfo-Felder einzeln aufteilen... oder einen Weg finden, damit der JSON-Serializer damit umgehen kann!
Und tatsächlich funktioniert auch XML nicht. Der XmlServiceClient
gibt mir diesen Fehler:
{"Fehler in Zeile 1 Position 290. Element ':AdjustmentRules' enthält Daten von einem Typ, der dem Namen 'http://schemas.datacontract.org/2004/07/System:ArrayOfTimeZoneInfo.AdjustmentRule' entspricht. Der Deserialisierer hat keine Kenntnis von einem Typ, der diesem Namen entspricht. Erwägen Sie die Verwendung eines DataContractResolver oder fügen Sie den Typen, der 'ArrayOfTimeZoneInfo.AdjustmentRule' entspricht, zur Liste der bekannten Typen hinzu - zum Beispiel, indem Sie das KnownTypeAttribute-Attribut verwenden oder ihn zur Liste der bekannten Typen hinzufügen, die an DataContractSerializer übergeben wird."}
Weiß jemand, warum es nicht standardmäßig behandelt wird?