C# 契约优先的WCF SOAP开发:控制基本类型XML序列化

C# 契约优先的WCF SOAP开发:控制基本类型XML序列化,c#,xml,wcf,soap,datacontract,C#,Xml,Wcf,Soap,Datacontract,我正在从给定的wsdl(契约优先开发)实现C#WCFSOAP1.1服务(服务器端)。我面临的问题是,xsd:dateTime、xsd:decimal和xsd:time还有其他(非wsdl)格式要求 由SvcUtil.exe生成的契约执行标准XML序列化格式化日期和小数有点不同 给定提供的示例SOAP消息,我的WCF服务存根在理解和转换这些格式方面没有问题。然而,我的回答确实包含额外的信息——时区、毫秒、小数点后的额外数字 Wsdl是巨大的–100多条消息,1000多个复杂类型。复杂类型的基元属性

我正在从给定的wsdl(契约优先开发)实现C#WCFSOAP1.1服务(服务器端)。我面临的问题是,xsd:dateTime、xsd:decimal和xsd:time还有其他(非wsdl)格式要求

SvcUtil.exe
生成的契约执行标准XML序列化格式化日期和小数有点不同

给定提供的示例SOAP消息,我的WCF服务存根在理解和转换这些格式方面没有问题。然而,我的回答确实包含额外的信息——时区、毫秒、小数点后的额外数字

Wsdl是巨大的–100多条消息,1000多个复杂类型。复杂类型的基元属性映射到XML属性。它看起来像是源自某个java框架

  • 严格而丑陋的解决方案是在或的某个位置使用或XSLT

  • 昂贵的解决方案是从wsdl构建器构建自己的代码,该代码将生成所描述的额外字符串属性

  • 我试图找到一种使用
    IXmlSerializable
    或自定义值类型自定义
    XmlSerializer
    的方法。两种解决方案都不起作用。只有固定的基元类型列表才能放入xml属性中

  • 因此,另一种昂贵的方法是编写自己的xml序列化程序,因为.NET
    XmlSerializer
    是一个黑盒,无法控制基元类型序列化

  • 还有更好的主意吗


    格式规范:

    xsd:decimal: No more than two digits after decimal
    xsd:dateTime: YYYY-MM-DDThh:mm:ss, no milliseconds, no time zone
    xsd:time: hh:mm:ss.sss
    xsd:date: YYYY-MM-DD
    

    修改序列化类中DateTime的set/get方法以进行转换。类是生成的,因此我必须扩展svcutil或构建自己的类如何使用工具生成?那么编辑工具输出的问题是什么呢?既然你使用的是 XMLSerialSuth,你可以考虑使用XSD.EXE的定制版本。看看哪一个给出了如何开始的想法。@dbc,谢谢,实际上我可以将wsdl拆分为wsdl+xsd,并使用以太或播放xsd.exe源代码。我要试一试。