WCF 日期时间偏移兼容性

2023-11-22

我有一个 .NET WCF 服务,其中包含一些采用 DateTimeOffset 的操作合约。这样做的目的是避免与 DST 和时区产生任何混淆。

然而,我怀疑使用 DateTimeOffset 毕竟是一个好主意,因为它相当不标准,并且会给任何试图连接 Java 应用程序或绑定到旧 .NET 版本的 .NET 应用程序的人带来麻烦。 。

另一种方法是期望使用 UTC 日期时间,但这会带来有人忘记使用 UTC 时间并使用本地时间调用服务的风险。 我还可以期望本地时间 DateTime,因为客户端将始终位于同一时区,但这在 DST 更改方面留下了一些微妙但经典的模糊性。

是否有人对服务接口中的 DateTimeOffset 有令人头疼的故事,或者毕竟使用起来相对没有问题?


我目前正在将一些基础设施更改为 WCF,并偶然发现了这个悬而未决的问题,并决定尝试一下。 :)

WCF序列化的方式DateTime and DateTimeOffset似乎有点奇怪。如以下示例所示,使用DateTime与其他平台合作时看起来是更好的选择:

using System;
using System.Runtime.Serialization;
using System.ServiceModel;

[ServiceContract]
public class DateTimeOffsetService
{
    [OperationContract]
    public Container DoWork()
    {
        return new Container
        {
            NowDateTime = DateTime.Now,
            UtcNowDateTime = DateTime.UtcNow,
            NowDateTimeOffset = DateTimeOffset.Now,
            UtcNowDateTimeOffset = DateTimeOffset.UtcNow
        };
    }
}

[DataContract]
public class Container
{
    [DataMember]
    public DateTime NowDateTime { get; set; }

    [DataMember]
    public DateTime UtcNowDateTime { get; set; }

    [DataMember]
    public DateTimeOffset NowDateTimeOffset { get; set; }

    [DataMember]
    public DateTimeOffset UtcNowDateTimeOffset { get; set; }
}

请求的响应 XML 为:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <DoWorkResponse xmlns="http://tempuri.org/">
      <DoWorkResult xmlns:a="http://schemas.datacontract.org/2004/07/RD.MES.WcfService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:NowDateTime>2012-03-23T15:59:47.8328698+01:00</a:NowDateTime>
        <a:NowDateTimeOffset xmlns:b="http://schemas.datacontract.org/2004/07/System">
          <b:DateTime>2012-03-23T14:59:47.8328698Z</b:DateTime>
          <b:OffsetMinutes>60</b:OffsetMinutes>
        </a:NowDateTimeOffset>
        <a:UtcNowDateTime>2012-03-23T14:59:47.8328698Z</a:UtcNowDateTime>
        <a:UtcNowDateTimeOffset xmlns:b="http://schemas.datacontract.org/2004/07/System">
          <b:DateTime>2012-03-23T14:59:47.8328698Z</b:DateTime>
          <b:OffsetMinutes>0</b:OffsetMinutes>
        </a:UtcNowDateTimeOffset>
      </DoWorkResult>
    </DoWorkResponse>
  </s:Body>
</s:Envelope>

我位于 GMT+01.00 时区,所以这些值似乎是正确的。为什么会这样呢?那么,WSDL 定义了Container像这样:

<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/WcfService">
    <xs:import schemaLocation="http://localhost:3608/DateTimeOffsetService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/System"/>
    <xs:complexType name="Container">
        <xs:sequence>
            <xs:element minOccurs="0" name="NowDateTime" type="xs:dateTime"/>
            <xs:element minOccurs="0" name="NowDateTimeOffset" type="q1:DateTimeOffset"/>
            <xs:element minOccurs="0" name="UtcNowDateTime" type="xs:dateTime"/>
            <xs:element minOccurs="0" name="UtcNowDateTimeOffset" type="q2:DateTimeOffset"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Container" nillable="true" type="tns:Container"/>
</xs:schema>

And DateTimeOffset- 在 WSDL 中 - 定义为:

<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/System">
    <xs:import schemaLocation="http://localhost:3608/DateTimeOffsetService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
    <xs:complexType name="DateTimeOffset">
        <xs:annotation>
            <xs:appinfo>
                <IsValueType>true</IsValueType>
            </xs:appinfo>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="DateTime" type="xs:dateTime"/>
            <xs:element name="OffsetMinutes" type="xs:short"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="DateTimeOffset" nillable="true" type="tns:DateTimeOffset"/>
</xs:schema>

所以基本上,DateTime被序列化为标准xs:dateTime(它确实有正确的时区部分)和DateTimeOffset被序列化为非标准复杂类型,调用者必须正确理解和处理该类型。

FWIW;既然我发现了这一点,我可能会使用DateTime对于 WCF 接口,除非我实际上需要处理不同的时区偏移。

目前,我认为支持使用复杂类型的唯一理由(因为xs:dateTime应该能够包含它所包含的所有信息!)是如果xs:dateTime已被用于序列化DateTime and DateTimeOffset,WCF 客户端不知道要使用哪种类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WCF 日期时间偏移兼容性 的相关文章

随机推荐

  • 如何在 log4j2 中为自定义记录器编写单元测试

    我创建了几个自定义记录器 其某些级别覆盖了 Log4J2 中的自定义记录器 我已按照指南进行操作http logging apache org log4j 2 x manual customloglevels html 我需要创建一些单元测
  • 文字字符串创建与字符串对象创建

    创建了多少个 String 对象 我正在为 SCJP 学习 我似乎无法解决这个字符串问题 根据我如何看待问题 我似乎看到了几种可能的答案 在下面的初始化中 创建了多少个字符串对象 String s1 A B C D System out p
  • 如何在 Spark 中分配和使用列标题?

    我正在阅读如下数据集 f sc textFile s3 test abc csv 我的文件包含 50 多个字段 我想为每个字段分配列标题 以便稍后在我的脚本中引用 我如何在 PySpark 中做到这一点 DataFrame 可以去这里吗 P
  • 如何使用 Google Drive API 通过 Javascript 下载文件

    我想使用 javascript API 从 google 驱动器下载文件 我已成功使用以下方法验证并加载文件列表gapi client drive files要求 但是 我坚持下载这些文件 我尝试下载该文件 var request gapi
  • 将自定义元数据从另一个 ItemGroup 添加到已定义的 ItemGroup

    我有以下内容
  • 什么是密封特质?

    密封类在 Scala 编程 中进行了描述 但密封特征则没有 我在哪里可以找到有关密封特征的更多信息 我想知道 密封特征是否与密封类相同 或者 如果不是 有什么区别 什么时候使用密封特征是个好主意 什么时候不是 A sealed特征只能在与其
  • 使用 WebApi 和映射模型实施 OData

    我正在尝试在 WebApi 中实现 OData 我正在使用存储库模式和 EF5 在后端 它仍然与我找到的所有示例一致 这就是事情变得不稳定的地方 我试图将 EF 生成的类隐藏在控制器中使用 AutoMapper 映射的模型后面 我看到的例子
  • 如何将 csv 中满足条件的行读取到 R 中?

    我正在尝试将一个大型 csv 文件读入 R 我只想读取并处理满足特定条件的一些行 例如Variable2 gt 3 这是一个小得多的数据集 我想将这些行直接读入数据帧 而不是将整个数据集加载到数据帧中 然后根据条件进行选择 因为整个数据集不
  • 使用 Scala 闭包,捕获的变量何时开始存在于 JVM 堆上?

    相关问题 Scala 闭包与 Java 内部类的比较 gt Final VS var 我想知道 Scala 何时使捕获到闭包中的变量存在于堆而不是堆栈上 我正在阅读 Martin Odersky 的 Scala 书 但目前我没有找到此信息
  • IMG 标签去除边框

    http www flirtwithme co main php upgrade 在此页面上有一个蓝色框图像 周围有灰色边框 我一直在尝试删除边框 但没有成功 eg border none outline none 该图像是精灵的一部分 图
  • .Net Core 项目是否需要 AssemblyInfo.cs 文件?

    我已将Asp Net框架中的WPF项目迁移到Asp Net core中 现有的 net 项目在属性文件夹内有 AssemblyInfo cs 使用以下命令创建新的 WPF 项目时 dotnet新wpf 添加 AssemblyInfo cs
  • 使用php统计html网页上的字数

    我需要一个 PHP 脚本 它获取网页的 URL 然后回显某个单词被提及的次数 Example 这是一个通用的 HTML 页面 h1 This is the title h1 p some description text here b th
  • C 字符串数组初始化 - 这是可变的吗? [复制]

    这个问题在这里已经有答案了 可能的重复 修改C字符串常量 指向 const char 的指针 vs char 数组 vs std string 我知道我可能会用这个问题打败死马 但我有点困惑 我还没有设法在 SO 或谷歌上找到确切的答案 我
  • 在Java中检查两个双精度数之间的相等性的好方法是什么

    对于 Double Float 从十进制转换为二进制表示形式时 会存在一些舍入误差和精度损失 例如 将 float 设置为 6 1 然后再次打印出来 您可能会得到类似于 6 099999904632568359375 的报告值 对于检查 2
  • 用外行人的话来说,PHP 或 Javascript 中的 Closures/Lambda 是什么? [复制]

    这个问题在这里已经有答案了 通俗来说 PHP 或 JavaScript 中的闭包 Lambda 是什么 一个例子非常有助于我的理解 我假设 Lambda 和闭包是同一件事 SO已经有了答案 什么是 lambda 函数 JavaScript
  • VB.NET Nullable 语法的历史

    我找不到确定的答案 从 C 2 0 开始你就可以声明 int i 125 作为简写 Nullable
  • 删除 JavaFX 2 LineChart 图例项

    我有一个包含许多系列的折线图 这些系列被分为一个或多个超级系列 每个超级系列可能在线中有许多 中断 以便准确地描述监视器进程何时不主动收集数据 每个数据中断实际上都是在开始一个新的系列 我已经成功地克服了几个技术问题 例如图表为每个新系列分
  • 将 os.system 的输出分配给变量并防止其显示在屏幕上[重复]

    这个问题在这里已经有答案了 我想分配我运行的命令的输出os system到一个变量并阻止它输出到屏幕 但是 在下面的代码中 输出被发送到屏幕并打印值var是0 我猜这表示命令是否成功运行 有没有什么方法可以将命令输出分配给变量并阻止它显示在
  • Axios onUploadProgress 在我的机器上只触发一次

    如果我用这个小提琴https jsfiddle net v70kou59 1 一切都按预期进行 function var output document getElementById output document getElementBy
  • WCF 日期时间偏移兼容性

    我有一个 NET WCF 服务 其中包含一些采用 DateTimeOffset 的操作合约 这样做的目的是避免与 DST 和时区产生任何混淆 然而 我怀疑使用 DateTimeOffset 毕竟是一个好主意 因为它相当不标准 并且会给任何试