サードパーティサーバーからのwsdlがあります。svcutilを実行し、一連の
XmlNode AMethod(object Request);
メソッド。各メソッドの応答/要求オブジェクトを説明する個別の100ページのPDFがあります
私の考えは、Webメソッドをラップし、XmlSerializerを使用して強く型付けされたオブジェクトを返すことでした。返されるxmlは次のようになります(soapヘッダーを削除しました):
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="ResponseExt"
xmlns="http://www.thirdparty.com/lr/">
<Code>0</Code>
<Message>SUCCESS</Message>
<SessionId>session_token</SessionId>
</Response>
シンプルに見えた。クラスを作成しました(ドキュメント/ワイヤーキャプチャから):
[XmlRoot("Response")]
//EDIT added XmlType
[XmlType("ResponseExt", Namespace = "http://www.thirdparty.com/lr/")]
public class MyClass {
public string Code {get; set;}
public string Message {get; set;}
public string SessionId {get; set;}
}
処理時間:
//XmlNode node = xml from above
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
XmlNodeReader reader = new XmlNodeReader(node);
Myclass myclass = serializer.Deserialize(reader) as MyClass
最後の行は、内部例外メッセージで爆発します:指定されたタイプは認識されませんでした:name ='ResponseExt' 、namespace =' http://www.thirdparty.com/lr/'、at<Response xmlns=''
>。
シリアライザーを幸せにする方法と、この2つが正確に何を意味するのか理解できません
xsi:type = "ResponseExt" xmlns = "http://www.thirdparty.com/lr/
いつものように、アドバイスやポインタは大歓迎です
編集:以下の受け入れられた答え。
これを見つけるまで、私はまだ例外を取得していました。うまくいけば、誰かの時間を節約できるでしょう。私は後ろ向きに働き始めました。ワイヤー上でキャプチャされたxml。正しい属性で作成したクラスに逆シリアル化:魅力のように機能しました。Webサービスから再試行しました-例外。何らかの理由で、XmlSerializerはResponseExtを認識しません。
XmlSerializer serializer = new XmlSerializer(typeof(Response));
XmlNode node = (XmlNode)results[0];
XmlDocument doc = new XmlDocument();
doc.LoadXml(node.OuterXml); //reload node
XmlNodeReader reader = new XmlNodeReader(doc.FirstChild); //there is only one node
Response rsp = serializer.Deserialize(reader) as Response; //works
編集:根本的な問題のwsdlファイルが完全ではありませんでした。これに2日間を費やし、この(醜い)回避策を見つけた後、サードパーティベンダーはエラーなしで逆シリアル化するすべてのタイプの完全なWSDLを提供しました。