使用svcutil从XSD生成DataContract标注类失败的技术求助
解决svcutil生成DataContract类时的
<xs:all>兼容性问题 你遇到的报错核心原因很清晰:DataContractSerializer(也就是svcutil /dconly默认依赖的序列化器)不支持XSD中的<xs:all>布局,它要求复杂类型的根粒子必须是<xs:sequence>或<xs:choice>,而你的loginRequest类型正好用了<xs:all>,所以无法完成映射。
下面给你三个可行的解决方案,按需选择:
方案1:修改XSD,替换<xs:all>为<xs:sequence>
这是最贴合你最初需求的方案——直接生成带DataContract注解的类。只需要把XSD里loginRequest的<xs:all>节点替换成<xs:sequence>:
<xs:element name="loginRequest"> <xs:complexType> <xs:sequence> <xs:element name="username" type="xs:string"/> <xs:element name="password" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
修改完成后重新运行你原来的命令:svcutil /dconly loginSoap.xsd /language:C#
这次就能成功生成带有[DataContract]和[DataMember]注解的类了。
方案2:使用xsd.exe生成类,配合XmlSerializerFormatAttribute
如果不能修改XSD(比如要和依赖该XSD的其他系统保持兼容),可以改用xsd.exe生成类,再让WCF切换到XmlSerializer处理:
- 执行xsd.exe命令生成类:
xsd.exe loginSoap.xsd /c /language:C#
生成的类会带有XmlSerializer相关注解(比如[XmlRoot]、[XmlElement]),而非DataContract注解。 - 在你的WCF服务契约接口上添加
[XmlSerializerFormat]属性,告诉WCF使用XmlSerializer来序列化/反序列化这些类型:[ServiceContract] [XmlSerializerFormat] public interface ILoginService { [OperationContract] LoginResponse Login(LoginRequest request); }
方案3:使用svcutil的/importXmlTypes选项
这个选项可以将XML类型导入为能和DataContractFormat配合使用的类型,无需修改XSD:
执行以下命令:svcutil /importXmlTypes loginSoap.xsd /language:C#
生成的类会带有[XmlType]注解,虽然没有DataContract注解,但依然可以在默认使用DataContractFormat的WCF服务中正常工作。
内容的提问来源于stack exchange,提问作者milorad
相关产品推荐
相关产品推荐

