XmlEnumAttribute在WCF请求中不起作用

时间:2014-04-03 11:38:49

标签: c# .net wcf xsd

我有一个XSD文件,其中包含以下序列:

<xs:simpleType name="typeVersion">
    <xs:restriction base="xs:string">
        <xs:enumeration value="01.01.01"/>
    </xs:restriction>
</xs:simpleType>

我使用XSD工具从中生成C#代码。序列被翻译为

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
public enum typeVersion {

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("01.01.01")]
    Item010101,
}

我使用生成的代码创建WCF服务请求。该请求包含typeVersion类型的项目。问题是Soap UI请求xml中的01.01.01将不会正确反序列化。它会抛出一条消息:The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:request. The InnerException message was 'Invalid enum value '01.01.01' cannot be deserialized into type 'typeVersion'. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.'. Please see InnerException for more details。 根据{{​​3}},XmlEnumAttribute应该能够将指定的字符串转换为相应的枚举值。出于好奇,我尝试将01.01.01替换为Item010101,并且请求已成功反序列化。

这怎么行不通,即使msdn明确指出该属性应该有效?有没有办法解决这个问题,让它发挥作用?首选不需要生成文件的解决方案。谢谢!

1 个答案:

答案 0 :(得分:3)

在设置需要使用XmlSerializer的WCF Web服务时,我遇到了同样的问题。解决方案是避免在服务规范及其操作中使用OperationFormatUse.Encoded

XmlSerializerFormat(Style = OperationFormatStyle.Rpc, Use = OperationFormatUse.Literal)

请注意,Literal是默认设置,因此可以省略:

XmlSerializerFormat(Style = OperationFormatStyle.Rpc)