如果在Web服务的wsdl / xsd中定义复杂对象类型,如何使WCF使用xs:All而不是xs:Sequence?
我遇到的问题是xs:Sequence要求调用应用程序按照WCF生成的xsd中指定的顺序传递soap消息中的元素(默认情况下,这是按字母顺序)。 xs:所有(或选择)并不关心订单。
可以通过某处的配置选项轻松更改此行为吗?
答案 0 :(得分:3)
从我的头脑中,我想你不能。你可以做的是手工编写WSDL文件,然后使用svcutil.exe生成代码。
如果要做的只是按字母顺序排列不同顺序的元素,可以使用[DataMember]属性上的Order(从1开始,而不是像数组一样)参数来排序DataContract中的元素([ DataMember(Order = 1)],[DataMember(Order = 2)]等。
答案 1 :(得分:2)
您可以切换WCF以使用XmlSerializer而不是DataContractSerializer。 XmlSerializer支持xs:all。见http://msdn.microsoft.com/en-us/library/ms733901.aspx
答案 2 :(得分:0)
即使您可以强制WCF这样做,反序列化器也无法正常工作以支持输入。下面的例子和解释。
输入1(好):
<MyOperation>
<AField>value A</AField>
<BField>value B</BField>
</MyOperation>
输入2(坏):
<MyOperation>
<BField>value B</BField>
<AField>value A</AField>
</MyOperation>
因此,如果输入1正确反序列化,则输入2不会--BField将具有已设置的值,但属性AField将为null。
如果WCF无法处理这种无序输入,我强烈认为它应该抛出一个异常,但基于我的测试(IIS中的.NET 3.5),它不会这样做,它只是跳过一些元素值。
此外,WCF也会忽略完全虚假的输入,只要它不影响它正在寻找的有效元素值。所以这个输入
<MyOperation>
<bogusField>with or without data</bogusField>
<AField>value A</AField>
<bogusField2 />
<BField>value B</BField>
<bogusField3></bogusField3>
</MyOperation>
不会抛出任何错误,实际上会反序列化AField和BField中的值。