【发布时间】:2011-03-27 03:39:58
【问题描述】:
我有一个用于生产应用程序的 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 条记录的时间戳为 2010 年 3 月 3 日晚上 11 点,
如果请求完全相同,我看不出客户端的任何差异如何真正解释它。
我想知道 WCF 消息跟踪中是否没有显示任何“带外”通信。疯狂的猜测:我们正在使用“WindowsAuthenticationBasicHttpBinding”,所以我想知道 WCF 是否向 AD 查询了语言环境信息或其他东西。
另外,为什么客户端忽略时区
我们并没有故意忽略时区,它似乎只是在发生。我们有带有 DateTime 属性的 DTO,它们通过从服务器到客户端的线路进行序列化,然后重新组装。为方便起见,我们在服务器端和客户端共享相同的 DTO 程序集,所以我(也许天真地)期望日期时间完整地往返。
【问题讨论】:
-
“错误”客户端是否始终为同一条目获取错误值,或者它是否在调用之间有所不同?它总是以同样的方式发生吗?如果请求绝对相同,我看不出客户端的任何差异如何真正解释它......另外,为什么客户端忽略时区偏移开始?
-
服务器上的响应是什么样的?
标签: c# wcf .net-3.5 windows-xp timezone