Java Web サービス エンドポイントを使用して、Visual Studio 2008 で C# Web サービス クライアントを作成しています。エンドポイントとそれが送り返す SOAP メッセージを制御することはできません。
Visual Studio の [サービス参照の追加] オプションを使用して、Web サービス WSDL から自動生成されたプロキシ クライアントを作成しました。リクエストを送信すると、次のような内容を含む有効な SOAP メッセージが返されます。
<java:a_field xmlns:java="java:com.whatever">Value1</java:a_field>
<java:different_field xmlns:java="java:com.whatever">Value2</java:different_field>
ただし、実際にはこれら 2 つの値は解析されず、それ以降の値はすべて null です。デバッグ後、自動生成された Reference.cs 内の次のコードが問題であることがわかりました。
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=30)]
public string different_field {
get {
return this.different_fieldField;
}
set {
this.different_fieldField = value;
this.RaisePropertyChanged("different_field");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=31)]
public string a_field {
get {
return this.a_fieldField;
}
set {
this.a_fieldField = value;
this.RaisePropertyChanged("a_field");
}
}
これら 2 つのフィールドは順不同であるため、適切にシリアル化されず、残りのフィールドはまったくシリアル化されません。WSDL 自体は、プロキシ クラスが期待するのと同じ順序でフィールドを宣言します。順序を変更するのは実際の応答です。2 つの Order= 値を手動で交換することでこれを回避できますが、WSDL が頻繁に変更され、この種のエラーをチェックする必要があるフィールドが数百あることを考えると、維持するのは非常に困難です。この順序の不一致を無視して、自動生成された Web サービス プロキシを引き続き使用できるようにするためのより良い方法はありますか?