我有一个使用 MessageContracts 的 WCF 服务。让我头疼的是,如果消息中元素的顺序发生变化,那么服务将忽略该元素。这是一个示例(删除了不相关的详细信息):如果我发送
<soapenv:Envelope ...>
<soapenv:Header/>
<soapenv:Body>
<bci:MySampleRequest>
<bci:Apples>some value here</bci:Apples>
<bci:Bananas>another value here</bci:Bananas>
<bci:Oranges>something else</bci:Oranges>
</bci:MySampleRequest>
</soapenv:Body>
</soapenv:Envelope>
然后就可以了。但是,如果我发送
<soapenv:Envelope ...>
<soapenv:Header/>
<soapenv:Body>
<bci:MySampleRequest>
<bci:Bananas>another value here</bci:Bananas>
<bci:Apples>some value here</bci:Apples>
<bci:Oranges>something else</bci:Oranges>
</bci:MySampleRequest>
</soapenv:Body>
</soapenv:Envelope>
然后 Bananas 值被忽略,并以 NULL 的形式出现。我的 MessageContract 类如下所示:
[WCF::MessageContract(WrapperName = "MySampleRequest", WrapperNamespace = "...")]
public partial class MySampleRequest {
private string bananas;
private string apples;
private string oranges;
[WCF::MessageBodyMember(Namespace = "...", Name = "Bananas")]
public string Bananas {
get { return effectiveDate; }
set { effectiveDate = value; }
}
[WCF::MessageBodyMember(Namespace = "...", Name = "Apples")]
public string Apples {
get { return apples; }
set { apples = value; }
}
[WCF::MessageBodyMember(Namespace = "...", Name = "Oranges")]
public string Oranges {
get { return oranges; }
set { oranges = value; }
}
}
我还应该提到我们正在使用 DataContractSerializer,虽然我在这里的示例是简单的字符串,但实际的消息对象要复杂得多,并且包括列表和 DataContract 对象。
看起来 WCF 默认按字母顺序排列成员。老实说,我什至不在乎使用什么排序。我想要的是让消费者能够以他们想要的任何顺序传递这些值,并且让服务仍然有效。即使没有指定顺序,XML 也很容易阅读,所以这似乎应该是可行的。
请注意,我真的不想更改序列化程序或从 MessageContract 更改为 DataContract - 这是我们生产环境中的现有服务,我真的无法做出会导致 WSDL 与现有代码不兼容的更改。当我尝试将这些 MessageContracts 更改为 DataContracts 时,它会导致 WSDL 的结构发生足够的变化,以至于与现有代码不兼容。