如何使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的结构发生足够大的变化,从而与现有代码不兼容。

如何使messagcontract在WCF订单不可知

WSDL是否在您想要以任何顺序传递的属性周围包装一个<sequence>元素?这可能是你的局限。WCF只是按照合同的规定办事。

从WSDL中删除<sequence>可能会破坏向后兼容性(尽管值得尝试快速测试)。所以我不确定你能做什么你是要求和维护现有的代码。