WSDLからsvcutil.exeで生成したWCFクライアントの構築に成功しました。生成されたクライアント プロキシ クラスを使用して、外部サービス サプライヤーの Web サービスを呼び出すことができます。生の XML 要求と応答の両方を完全な SOAP メッセージとしてデータベースに記録する必要があるため、メッセージ インスペクターのコーディングにも成功しました。
緊急のシナリオでは、生の XML 応答を「インポート」できる必要もあります。XMLSerializer
メッセージ コントラクトに基づく WCF メッセージの使用または逆シリアル化に関する多くのヒントを見つけました。
しかし、操作契約に基づいて生の XML 応答を逆シリアル化するにはどうすればよいでしょうか? 最初のテストでは、ログに記録された生の応答の 1 つを使用してファイルに保存し、クライアント プロキシで生成された応答タイプに逆シリアル化してみます。DeserializeReply()
何とかclass からの呼び出しに成功しなければなりませんClientOperation
。しかし、どうやってそこに着くのですか?
私はWCFを初めて使用するので、どんな助けも喜んで受け入れます... TIA、Stefan
これは、マークの答えの後に私が試したものです:
public static RatingResult DeserializeResponseFromFile(string path)
{
var xmlReader = XmlReader.Create(path);
var message = Message.CreateMessage(xmlReader, int.MaxValue, MessageVersion.Soap11);
var readerAtBodyContents = message.GetReaderAtBodyContents();
var dcs = new DataContractSerializer(typeof(RatingResult), "RatingResponse", "http://rating.webservice.xxx.de");
// Error in line 6 position 7. 'EndElement' 'RatingResponse' from namespace
// 'http://rating.webservice.xxx.de' is not expected.
// Expecting element 'commonDataField'.
var wsResult = (RatingResult)dcs.ReadObject(readerAtBodyContents);
return wsResult;
}
これは、ログに記録された XML 応答ファイルの一部であり、次のように逆シリアル化しようとしていますRatingResponse
。
<soapenv:Envelope xmlns:soapenv="..." xmlns:soapenc="..." xmlns:xsd="..." xmlns:xsi="...">
<soapenv:Header soapenv:encodingStyle="..." />
<soapenv:Body soapenv:encodingStyle="...">
<p933:RatingResponse xmlns:p933="http://rating.webservice.xxx.de">
<RatingReturn href="#id0" />
</p933:RatingResponse>
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="..." xsi:type="p878:RatingResult" xmlns:p878="http://output.rating.webservice.xxx.de">
<commonData href="#id1" />
<acctData href="#id2" />
<resultData href="#id3" />
</multiRef>
<multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="..." xsi:type="p719:RatingCommonData" xmlns:p719="http://input.rating.webservice.xxx.de">
<requestdate xsi:type="xsd:dateTime">2010-12-24T09:45:09.531Z</requestdate>
...
データ コントラクト シリアライザーには、href の逆シリアル化に問題があると思います。「手動で」逆シリアル化しようとしているメッセージは、挿入されたメッセージ インスペクタを使用してキャプチャされたことに注意してください。Web サービスの「通常の」呼び出しでは、このメッセージは問題なく逆シリアル化されます。