我有一个生产应用程序的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 这五个元素在每条消息上都是不同的 - 否则消息流是相同的,除了上面提到的日期/时间。
总结:
我认为机器之间必定有补丁或不同的东西,但经过8个小时的搜索,我还没有找到它。谢谢你的时间。
更新
“错误”的客户端是否始终为同一条目获取错误的值,或者它是否因呼叫而异?它总是以同样的方式发生吗?
每个客户在呼叫之间都非常一致。
Web服务调用序列导致26784个不同的时间序列观察。两个客户端获得相同数量的结果,但与值关联的时间戳不同。对于一个客户,所有26784个值都是午夜对齐的;另一方面,5630个值(21%)比它们应该提前1小时抵消。并非所有特定日期/时间的示例都会被抵消:例如,992条记录应该有时间戳31/3 / 2010,448而不是30/3/2010 11pm,
如果请求完全相同,我无法看到如何通过客户端的任何差异来解释它。
我想知道WCF消息跟踪中是否有任何“带外”通信未显示。狂野猜测:我们正在使用“WindowsAuthenticationBasicHttpBinding”,所以我想知道WCF是否查询了AD的区域设置信息等等。
此外,为什么客户忽略时区
我们并没有故意忽略时区,它似乎正在发生。我们有DTO,DateTime属性通过线路从服务器到客户端进行序列化,然后重新组装。为方便起见,我们在服务器端和客户端都共享相同的DTO程序集,因此我(可能会很自然地)期望日期时间完整地往返。
答案 0 :(得分:1)
本地IT人员设法确定了答案:
显示“错误”信息的客户端PC(时间戳在晚上11点)缺少修补程序KB981793 - 时区规则的累积修补程序。
不是我所期望的 - 但是安装该修补程序已经解决了我们测试的每台机器上的问题。