【问题标题】:How to generate xs:Date in WCF OperationContract parameter如何在 WCF OperationContract 参数中生成 xs:Date
【发布时间】:2009-04-22 10:30:11
【问题描述】:

对于仅表示日期的 OperationContract 参数(无时间组件或时区指示符),最好使用 xs:Date,以避免客户端和服务器之间的时区转换出现任何歧义或问题。

WCF 目前仅支持 xs:DateTime 用于序列化 DateTime 参数。

生成带有将被序列化为 xs:Date 参数的 OperationContract 的最简单方法是什么?

我正在考虑使用自定义 .NET 类型“public struct DateOnly”或类似类型,隐式转换为/从标准 DateTime 转换,以某种方式自动生成 wsdl 作为 xs:Date。

这可能吗?我将如何实施它?

如果可能的话,我怀疑该解决方案可能涉及在自定义类型上使用 XmlSchemaProviderAttribute,但我找到的有关此属性的任何文档似乎都有些不透明。

更新

我很难相信它会增加获得解决方案的可能性,但我会听从网站的建议并开始赏金。

为了清楚起见,赏金的条件是提供构造解决方案所需的所有信息,以便 WCF OperationContract 的参数可以是:

  • 序列化为 ws:Date 并在生成的 WSDL 中如此描述。

  • 可以是 System.DateTime 值,也可以隐式转换为 DateTime 或从 DateTime 转换。

【问题讨论】:

标签: .net xml wcf


【解决方案1】:

现在我注意到了这一点,我在 Connect 中创建了一个新的建议,地址为 Please Fully Support xs:Date for Date-Only Parameters and DataMembers。我给它打了四颗星(重要)。

如果有人阅读本文认为这很重要(或不同意),请使用 Connect 对其进行投票或评论。

【讨论】:

  • 仅供参考:我也将您的 Connect 建议评为 4 星。
  • 我当然认为这很重要。在您的连接建议中,您声明“我知道可以使用 [XmlSerializationFormat] 来使用 XML 序列化程序而不是数据合同序列化程序”。虽然这是 DataContracts 的一种解决方法,但我的理解是没有办法为操作合同参数指定 XML 序列化。这种理解正确吗?在任何情况下,MS 对原始(关闭)Connect 建议的响应表明他们正在考虑将其用于“v.Next”(不确定这是否意味着 V4 或以下版本)。
  • 我相信可以配置整个服务契约、服务或端点来使用 xml 序列化程序。不太清楚如何。
  • 指向 Microsoft Connect 站点的链接已失效
【解决方案2】:

您指定了将 xs:Date 作为操作中的参数的要求。问题是,有一种正式的方式来指定这些需求:WSDL。 如果我这样做,我会使用 WSDL First 方法。从定义所需合同的 WSDL 开始,包括接口中的 xs:date,无论您想要它在哪里。然后使用 svcutil.exe 生成服务存根。记得传入 /serializer:xmlSerializer 。

【讨论】:

    【解决方案3】:

    我也得到了描述的问题。我开发了自己的解决方案 - WcfDate 自定义类型。发布在这里:WCF Support for xs:date

    【讨论】:

      【解决方案4】:

      WCF 的默认序列化程序 (DataContractSerializer) 不支持它。但是 XmlSerializer 支持它。

      1 - 将 [XmlSerializerFormat] 属性添加到您的合同...

      [XmlSerializerFormat]
      [ServiceContract]
      public interface IMyContract
      {
         MyType GetData();
      }
      

      2 - 在 DataContract 类型中,将 [XmlElement(DataType = "date")] 添加到成员。

      public class MyType
      {
           [XmlElement(DataType = "date")]
           public DateTime BirthDate {get; set;}
      }
      

      希望对你有帮助

      【讨论】:

      • 这对 OperationContract 的日期参数没有帮助。
      • 对不起,我没有意识到你在谈论简单的 DateTime 参数。但是如果你不切换到 [XmlSerializerFormat],你的复杂类型不会有同样的问题吗?
      • 是的,DataMembers 和 OperationContract 参数存在同样的问题。对于 DataMembers,使用 XML 序列化是一种解决方法(即使它确实失去了 DataContracts 的一些好处)。但我正在寻找一种适用于这两种情况的解决方案,等待微软正在考虑对“v.Next”进行修复:connect.microsoft.com/wcf/feedback/…
      • Microsoft Connect 站点的链接已失效。
      【解决方案5】:

      很遗憾,WCF 不支持 xs:Date 类型。您必须创建自己的“DateOnly”结构,例如:

      <DataContract()> _
      public struct DateOnly
         <DataMember()> public Month as Integer
         <DataMember()> public Day as Integer
         <DataMember()> public Year as Integer
      end struct
      

      【讨论】:

      • 是的,我认为我需要创建自己的结构,但我想让它序列化为 xs:Date(使用自定义 XML 序列化)?这样识别 xs:Date 的非 WCF 客户端就不再需要其他自定义类型了。
      • 除了动态修改 WSDL 的 XML 之外,我不知道有任何方法可以更改它。不过,我不确定性能影响。本文并未完全解决您的情况,但可以帮助您了解如何修改 SOAP 消息内容。 blogs.msdn.com/kaevans/archive/2008/01/08/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多