2016-11-04 4 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を見ると、タグを含むように見えます。だから、あなたはこれを変えずに既存のコードを維持することができないのは正しいと思います。 WSDLがこのように生成されるのを防ぐために、C#コードで何ができるのでしょうか? (私は推測していない、これはおそらくWCFが行うものです)。 –

関連する問題