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ないとき、それは好きではないように見えます。
DataContractは操作で指定したものと同じである必要があります。ここでDataContractは 'xxx'ですが、 'yyy'に変更しています。 'xxx'のインスタンスを送信してみてください –
Mmmh私が正しく理解しているか分からないのは、 'xxx'がメソッドです。私がm_MyService.YYY()を呼び出すと、まずBeforeSendRequestにロードされたメソッドがm_MyService.YYY()である場合にのみ動作します。私がYYY以外の方法を呼び出すと失敗します。 – KingOfBabu