对于仅表示日期的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。
答案 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;}
}
希望这有帮助