我有一个使用MessageContracts的WCF服务。令我头痛的是,如果消息中元素的顺序发生改变,那么该服务将忽略该元素。 下面是一个例子(与非相关细节删除): 如果我送如何使WCF订单中的MessageContract不可知?
<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>
那么香蕉值被忽略,并附带通过为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的结构变得足以与现有代码不兼容。
看着WSDL,它看起来好像是包括标签。所以我想你是对的,无法改变这一点,仍然维持现有的代码。任何想法都可以在C#代码中完成,以防止以这种方式生成WSDL? (我猜不是,这可能只是WCF所做的。) –