0

我有一个使用 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 的结构发生足够的变化,以至于与现有代码不兼容。

4

1 回答 1

0

WSDL 是否<sequence>围绕要以任何顺序传递的属性包装元素?这可能是你的限制。WCF 只是遵循合同的规则。

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

于 2016-11-06T17:09:19.883 回答