2008-11-03 10 views
5

Tenemos una aplicación de programación ejecutándose que llama a un servicio WCF para ejecutar trabajos nocturnos. Una gran cantidad de estos incluyen información sobre la fecha comercial actual. Por motivos comerciales, el servidor de programación está configurado en GMT, pero nuestro servicio se está ejecutando en servidores configurados a la hora de Nueva York.Manejo de WCF Deserialización de objetos DateTime

Esto plantea un problema; las fechas se pasan a nuestro servicio .NET con información explícita sobre la zona horaria. Entonces, cuando el servicio le dice a la aplicación que se ejecute con una fecha de "2008-11-03 00:00:00 +0: 00", el servicio lo interpreta como "2008-11-02 19:00:00 -5: 00 "y las cosas se ejecutan con la fecha incorrecta.

El comportamiento del planificador es de terceros y está codificado, por lo que no podemos decirle al planificador que omita el desplazamiento de la zona horaria. No queremos convertir siempre la fecha a GMT porque existe una posibilidad real de que nuestras oficinas asiáticas llamen al mismo servicio y volveremos al mismo problema.

¿Hay alguna manera de marcar el DataContract, o incluso controlarlo a un nivel lo suficientemente bajo como para asegurarse de que DateTime Kind no se especifique? ¿O hay alguna manera con DateTime para determinar cuál era la información original utilizada para crearla y convertirla al valor original en un paso posterior al procesamiento?

Si ayuda, en este momento nuestro contrato es bastante simple. Los métodos toman un parámetro que es una clase derivada de la clase a continuación.

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

Si desea que el servidor de programación se configure en GMT, configure la zona horaria del sistema operativo en GMT. –

Respuesta

3

Si entiendo correctamente el problema, se podría solucionar este en el procesamiento posterior por el simple uso DateTime.ToUniversalTime() en el lado del servicio. Para su ejemplo, esto debería obtener un DateTime con el valor "2008-11-03 00:00:00" y Kind = DateTimeKind.Utc. Ahora bien, si necesita este mismo valor, pero como Local o No especificado, puede usar DateTime.SpecifyKind(DateTime, DateTimeKind) para establecer el Tipo sin cambiar el valor.

+0

Sí ... mantener lo que el servicio devuelve como UTC, dejar que los clientes lo conviertan o lo interpreten. –

Cuestiones relacionadas