Web Service的结果中的时区不一致

时间:2010-08-09 06:32:54

标签: c# wcf .net-3.5 windows-xp timezone

我有一个生产应用程序的Web服务,它为同一个入站请求向不同的客户端返回不同的结果。

我通过配置我的客户端将原始WCF消息转储到跟踪文件来发现这一点,然后我将其进行比较。

对于一台客户端计算机,响应包括目标时区+13:00的日期/时间 - 又名NZDT(新西兰夏令时)(参见ObservedDate元素):

<b:ObservationDTO>
    <b:mVersionNumber>0</b:mVersionNumber>
    <b:mBoolValue i:nil="true"></b:mBoolValue>
    <b:mDateValue i:nil="true"></b:mDateValue>
    <b:mIsNull>true</b:mIsNull>
    <b:mNumericValue i:nil="true"></b:mNumericValue>
    <b:mObservationID>0</b:mObservationID>
    <b:mObservedDate>2005-09-30T00:00:00+13:00</b:mObservedDate>
    <b:mTextValue i:nil="true"></b:mTextValue>
</b:ObservationDTO>

对于另一台客户端机器,响应包括针对时区+12:00的日期/时间 - 又名NZST(新西兰标准时间)(参见ObservedDate元素):

<b:ObservationDTO>
    <b:mVersionNumber>0</b:mVersionNumber>
    <b:mBoolValue i:nil="true"></b:mBoolValue>
    <b:mDateValue i:nil="true"></b:mDateValue>
    <b:mIsNull>true</b:mIsNull>
    <b:mNumericValue i:nil="true"></b:mNumericValue>
    <b:mObservationID>0</b:mObservationID>
    <b:mObservedDate>2005-09-29T23:00:00+12:00</b:mObservedDate>
    <b:mTextValue i:nil="true"></b:mTextValue>
</b:ObservationDTO>

麻烦的是,客户端没有了解所包含的时区信息,因此向用户显示(对于此示例) 2005年9月29日,晚上11:00

我已经仔细检查了,所有涉及的机器(客户端,应用程序服务器和Web服务器)都正确配置为NZST:

在客户端和服务器之间跟踪WCF消息,我看到的唯一其他差异是:

  • <TimeCreated> - 创建消息时
  • <Execution> - 来源流程
  • <Computer> - 客户端计算机的名称
  • <MessageLogTraceRecord> - WCF消息时间戳?
  • <MessageID> - 消息的GUID

这五个元素在每条消息上都是不同的 - 否则消息流是相同的,除了上面提到的日期/时间。

总结:

  • 两个测试都针对同一个应用程序服务器(因此,同一个数据库)
  • 运行
  • 两台客户端PC都提出了同样的要求
  • 对请求的响应有某些(约20%)针对错误时区的观察
  • 所有机器都配置为时区+1200(NZST)。

我认为机器之间必定有补丁或不同的东西,但经过8个小时的搜索,我还没有找到它。谢谢你的时间。

更新

  

“错误”的客户端是否始终为同一条目获取错误的值,或者它是否因呼叫而异?它总是以同样的方式发生吗?

每个客户在呼叫之间都非常一致。

Web服务调用序列导致26784个不同的时间序列观察。两个客户端获得相同数量的结果,但与值关联的时间戳不同。对于一个客户,所有26784个值都是午夜对齐的;另一方面,5630个值(21%)比它们应该提前1小时抵消。并非所有特定日期/时间的示例都会被抵消:例如,992条记录应该有时间戳31/3 / 2010,448而不是30/3/2010 11pm,

  

如果请求完全相同,我无法看到如何通过客户端的任何差异来解释它。

我想知道WCF消息跟踪中是否有任何“带外”通信未显示。狂野猜测:我们正在使用“WindowsAuthenticationBasicHttpBinding”,所以我想知道WCF是否查询了AD的区域设置信息等等。

  

此外,为什么客户忽略时区

我们并没有故意忽略时区,它似乎正在发生。我们有DTO,DateTime属性通过线路从服务器到客户端进行序列化,然后重新组装。为方便起见,我们在服务器端和客户端都共享相同的DTO程序集,因此我(可能会很自然地)期望日期时间完整地往返。

1 个答案:

答案 0 :(得分:1)

本地IT人员设法确定了答案:

显示“错误”信息的客户端PC(时间戳在晚上11点)缺少修补程序KB981793 - 时区规则的累积修补程序。

不是我所期望的 - 但是安装该修补程序已经解决了我们测试的每台机器上的问题。