如何使messagcontract在WCF订单不可知
本文关键字:不可知 WCF 何使 messagcontract | 更新日期: 2023-09-27 18:16:18
我有一个使用messagcontracts的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>
则忽略banana值,并显示为NULL。我的messagcontract类看起来像这样:
[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也很容易阅读,所以这看起来应该是可行的。
请注意,我真的不想更改序列化器,也不想从messagcontract更改为datcontract——这是我们生产环境中的现有服务,我真的不能做出会导致WSDL与现有代码不兼容的更改。当我尝试将这些messagcontracts更改为DataContracts时,它会导致WSDL的结构发生足够大的变化,从而与现有代码不兼容。
WSDL是否在您想要以任何顺序传递的属性周围包装一个<sequence>
元素?这可能是你的局限。WCF只是按照合同的规定办事。
从WSDL中删除<sequence>
可能会破坏向后兼容性(尽管值得尝试快速测试)。所以我不确定你能做什么你是要求和维护现有的代码。