我有一些用于某些RESTful服务的XSD架构.当与xsd.exe工具结合使用以生成C#代码时,XSD会xs:date生成以下代码:
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
public System.DateTime time {
get {
return this.timeField;
}
set {
this.timeField = value;
}
}
Run Code Online (Sandbox Code Playgroud)
将XML反序列化为使用XmlSerializerall的对象似乎很好.我面临的问题是服务要求将日期格式化为YYYY-MM-DD hh:mm:ss,并且XSD生成的代码似乎只生成YYYY-MM-DD.
如果我手动修改XSD以进行xs:dateTime输入,则生成的C#代码会产生:2010-08-20T20:07:03.915039Z.
基本上,我如何强制序列化生成YYYY-MM-DD hh:mm:ss?是否可以对XSD做些什么或者我可以做些什么来改变生成的C#代码?
大约4年前,我遵循这篇MSDN文章,了解了在.Net 1.1和ASMX Web服务(使用SQL 2000服务器作为后端)上构建.Net客户端的DateTime使用最佳实践.我还记得我对DateTime的序列化问题以及不同时区服务器的测试工作.
我的问题是:对于某些新技术(如WCF和SQL Server 2008)是否有类似的最佳实践文档,特别是添加了新的日期时间类型以存储时区感知信息.
这是环境:
对每个层中使用的数据类型有什么好的建议/最佳实践吗?
对于仅表示日期的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.
我试图通过使用svcutil.exe创建WCF代理来使用使用WSDL指定的Web服务,但WSDL指定某些操作具有可选的参数(minOccurs ="0"),例如:
<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" />
Run Code Online (Sandbox Code Playgroud)
不幸的是,生成的代理不允许我不指定值(参数不可为空),并且没有"指定"字段作为指示代理不应发送任何值的调用的一部分.
有没有办法使用svcutil生成一个允许我这样做的代理?
(另一方面,我注意到,通过我的研究,其他人能够使用"添加服务引用"功能正确生成这些额外的"指定"字段,但无论出于何种原因,Visual Studio似乎不希望在生成代理之后我添加了参考(之后没有任何事情发生))
使用的命令:svcutil http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl/internal /n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs/config: App.config/nologo