2008-11-03 12 views
5

Wir haben eine Scheduling-Anwendung ausgeführt, die einen WCF-Dienst aufruft, um nächtliche Jobs auszuführen. Eine große Anzahl enthält Informationen über das aktuelle Geschäftsdatum. Aus geschäftlichen Gründen ist der Planungsserver auf GMT eingestellt, aber unser Dienst läuft auf Servern, die auf NY-Zeit eingestellt sind.Behandlung der WCF-Deserialisierung von DateTime-Objekten

Dies wirft ein Problem auf; Die Daten werden mit expliziten Zeitzoneninformationen an unseren .NET-Dienst übergeben. Wenn also der Dienst der Anwendung mitteilt, dass er mit dem Datum "2008-11-03 00:00:00 + 0: 00" ausgeführt werden soll, interpretiert der Dienst dies als "2008-11-02 19:00:00 -5: 00" "Und die Dinge laufen mit dem falschen Datum.

Das Scheduler-Verhalten ist von Drittanbietern und fest codiert, sodass wir dem Scheduler nicht mitteilen können, dass der Zeitzonenoffset weggelassen werden soll. Wir möchten das Datum nicht immer auf GMT umstellen, da es eine reale Möglichkeit gibt, dass unsere asiatischen Büros den gleichen Service anrufen und wir wieder bei demselben Problem sind.

Gibt es eine Möglichkeit, den DataContract zu kennzeichnen oder ihn sogar auf eine ausreichend niedrige Stufe zu steuern, um sicherzustellen, dass die DateTime-Art nicht spezifiziert ist? Oder gibt es einen Weg mit einer DateTime, um zu bestimmen, was die ursprüngliche Information war, die verwendet wurde, um es zu erstellen, und es in einem Nachbearbeitungsschritt zurück zu dem ursprünglichen Wert zu konvertieren?

Wenn es hilft, jetzt ist unser Vertrag ziemlich einfach. Methoden nehmen einen Parameter, der eine Klasse ist, die von der folgenden Klasse abgeleitet ist.

[DataContract] 
public class BaseTimeSensitiveParameters 
{ 
    [DataMember] public DateTime? BusinessDate; 
} 
+0

Wenn der Planungsserver auf GMT eingestellt werden soll, legen Sie die OS-Zeitzone auf GMT fest. –

Antwort

3

Wenn ich das Problem richtig verstanden hat, können Sie dies in der Nachbearbeitung lösen, indem einfach DateTime.ToUniversalTime() auf der Serviceseite verwendet wird. Für Ihr Beispiel sollte dies eine DateTime mit dem Wert "2008-11-03 00:00:00" und Kind = DateTimeKind.Utc ergeben. Wenn Sie jetzt denselben Wert benötigen, aber als Lokal oder Nicht spezifiziert, können Sie DateTime.SpecifyKind(DateTime, DateTimeKind) verwenden, um den Typ festzulegen, ohne den Wert zu ändern.

+0

Ja ... behalte, was der Dienst als UTC zurückgibt, überlasse es den Clients zu konvertieren oder zu interpretieren. –

Verwandte Themen