2016-11-04 37 views
0

我有一个使用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的结构变得足以与现有代码不兼容。

回答

0

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

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

+0

看着WSDL,它看起来好像是包括标签。所以我想你是对的,无法改变这一点,仍然维持现有的代码。任何想法都可以在C#代码中完成,以防止以这种方式生成WSDL? (我猜不是,这可能只是WCF所做的。) –

相关问题