如何在WCF OperationContract参数中生成xs:Date

时间:2009-04-22 10:30:12

标签: .net xml wcf

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

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

使用将被序列化为xs:Date?

的参数生成OperationContract的最简单方法是什么?

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

这可能吗,我将如何实施呢?

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

更新

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

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

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

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

5 个答案:

答案 0 :(得分:5)

现在我已经注意到了这一点,我在Please Fully Support xs:Date for Date-Only Parameters and DataMembers创建了一个新的Connect of Suggestion。我用四颗星(重要)对此进行了评分。

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

不幸的是,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

答案 4 :(得分:1)

WCF的defaut序列化程序(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;}
}

希望这有帮助