【问题标题】:How to make MessageContract in WCF order agnostic?如何使 WCF 中的 MessageContract 订单不可知?
【发布时间】:2016-11-04 20:19:54
【问题描述】:

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

【问题讨论】:

    标签: c# web-services wcf wsdl messagecontract


    【解决方案1】:

    WSDL 是否将&lt;sequence&gt; 元素包装在您要以任意顺序传递的属性周围?这可能是你的限制。 WCF 只是遵循合同的规则。

    从 WSDL 中删除 &lt;sequence&gt; 可能会破坏向后兼容性(尽管值得快速测试一下)。因此,我不确定您是否可以按照您的要求执行并维护现有代码。

    【讨论】:

    • 查看 WSDL,它看起来确实包含 标记。所以我想你是对的,不能改变这个并且仍然维护现有的代码。知道可以在 C# 代码中执行的任何操作以防止以这种方式生成 WSDL 吗? (我猜不是,这可能只是 WCF 所做的事情。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多