1

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 サービスの「通常の」呼び出しでは、このメッセージは問題なく逆シリアル化されます。

4

2 に答える 2

3

何をお願いしたいのか、何をしようとしているのかよくわかりません。操作コントラクトは、サービスメソッドとしてマークするために操作/メソッド呼び出しに設定する属性にすぎません....操作コントラクトは、シリアル化または逆シリアル化にリモートで関与しても何もしません.....どういう意味ですか?DataContractSerializerWCFのデフォルトのシリアライザーを使用してXMLメッセージを逆シリアル化するには??

あなたが本当にHOWTOを意味すると仮定します:DataContractSerializerを使用してWCFメッセージを逆シリアル化し、次にこれを試してください:デフォルトのWCFを使用したサービス呼び出しからの応答XMLがある場合、次のDataContractSerializerように逆シリアル化できるはずです(XMLがあると仮定しますxmlResponse変数のシリアル化された応答):

using(MemoryStream memStm = new MemoryStream())
using(StreamWriter stw = new StreamWriter(memStm))
{
   // write your response to the memory stream
   stw.Write(xmlResponse);
   stw.Flush();

   // "reset" memory stream
   memStm.Seek(0, SeekOrigin.Begin);

   // setup DataContractSerializer     
   DataContractSerializer dcs = new DataContractSerializer(typeof(YourDataType));

   // deserialize result XML into an instance of "YourDataType"
   var result = dcs.ReadObject(memStm);
}
于 2010-12-26T21:36:51.120 に答える