2016-06-22 7 views
0

WCFテクノロジを使用して.NETでJSONに保存されたログを再生する必要があります。ソフトウェアはIClientMessageInspectorを使用してログを取得し、その後 をJSONに保存します。だから、私はこのログを取得し、再度それらを注入する必要があります。これを行うには、ログを取得したときと同じようなことをしました。 WCF EndPointを拡張し、新しいパラメータでメッセージを修正しました。コードは次のとおりです。WCFテクノロジを使用した再生ログ

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
      { 
        XmlDocument doc = new XmlDocument(); 
        doc.LoadXml(record.Message.ToString()); 
        var ms = new MemoryStream(); 

        XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(ms); 
        doc.WriteTo(writer); 
        writer.Flush(); 
        ms.Position = 0; 
        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(ms, XmlDictionaryReaderQuotas.Max); 
        Message newReply = Message.CreateMessage(request.Version, null, reader); 
        newReply.Headers.CopyHeadersFrom(request); 
        request = newReply; 
      } 

この関数は正しい値を持っているようです。しかし、jsonファイルに応じて、さまざまな関数を呼び出すことができます。

m_MyService.XXX(); 

そして、私は「BeforeSendRequest」でそれを修正するので、私はどの機能も問題shoudln't:その「BeforeSendRequest」方法、 に行くことができるようにするために、私は、例えば、既存のメソッドを呼び出す必要がありますここに電話する。 しかし、それは私にエラーを返しません:

System.ServiceModel.CommunicationException: Erreur lors de la désérialisation du corps du message de demande pour l'opération 'XXX'. OperationFormatter a rencontré un corps de Message non valide. Type de nœud 'Element' attendu avec le nom 'XXX' et l'espace de noms 'http://tempuri.org/'. Type de nœud 'Element' trouvé avec le nom 'YYY' et l'espace de noms 'http://tempuri.org/'. ---> System.Runtime.Serialization.SerializationException: OperationFormatter a rencontré un corps de Message non valide. Type de nœud 'Element' attendu avec le nom 'XXX' et l'espace de noms 'http://tempuri.org/'. Type de nœud 'Element' trouvé avec le nom 'YYY' et l'espace de noms 'http://tempuri.org/'. 
    à System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(XmlDictionaryReader reader, Object[] parameters) 
    à System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters) 
    --- Fin de la trace de la pile d'exception interne --- 
    à System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters) 
    à System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

メソッド呼び出しが)(m_MyService.YYYないとき、それは好きではないように見えます。

+0

DataContractは操作で指定したものと同じである必要があります。ここでDataContractは 'xxx'ですが、 'yyy'に変更しています。 'xxx'のインスタンスを送信してみてください –

+0

Mmmh私が正しく理解しているか分からないのは、 'xxx'がメソッドです。私がm_MyService.YYY()を呼び出すと、まずBeforeSendRequestにロードされたメソッドがm_MyService.YYY()である場合にのみ動作します。私がYYY以外の方法を呼び出すと失敗します。 – KingOfBabu

答えて

0

私は最終的に解決策を見出し、それが助けてくれることを願っています。私はちょうどヘッダーの "アクション"を変更する必要がありました。したがって、次の行を追加してください:

newReply.Headers.Action = "desiredcontent"; 
関連する問題