【问题标题】:Inconsistent time zone in results from Web ServiceWeb 服务的结果中的时区不一致
【发布时间】: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 消息,我看到的唯一其他区别是:

  • &lt;TimeCreated&gt; - 创建消息的时间
  • &lt;Execution&gt; - 源进程
  • &lt;Computer&gt; - 客户端计算机的名称
  • &lt;MessageLogTraceRecord&gt; - WCF 消息时间戳?
  • &lt;MessageID&gt; - 消息的 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


【解决方案1】:

当地的 IT 人员设法找出答案:

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

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

【讨论】:

  • 优秀。很高兴听到您找到了解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多