使用 WCF 技术重放日志
Replay log using WCF technology
我需要使用 WCF 技术在 .NET 中重播保存在 JSON 中的一些日志。该软件使用 IClientMessageInspector 获取日志和
之后将它们保存在 JSON 中。所以,我需要获取这些日志并再次注入它们。为此,我做了与获取日志时类似的操作。
我确实扩展了 WCF EndPoint 并使用新参数修改了消息。这是代码:
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 文件调用许多不同的函数。为了能够进入 "BeforeSendRequest" 方法,
我需要调用现有方法,例如:
m_MyService.XXX();
而且因为我在 "BeforeSendRequest" 中修改了它,所以我在这里调用哪个函数应该无关紧要。
但是,它确实 return 我的错误:
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();
时,它似乎不喜欢
终于找到解决办法了,希望对你有帮助。我只需要修改 header 中的 "action"。所以只需添加这一行:
newReply.Headers.Action = "desiredcontent";
我需要使用 WCF 技术在 .NET 中重播保存在 JSON 中的一些日志。该软件使用 IClientMessageInspector 获取日志和 之后将它们保存在 JSON 中。所以,我需要获取这些日志并再次注入它们。为此,我做了与获取日志时类似的操作。 我确实扩展了 WCF EndPoint 并使用新参数修改了消息。这是代码:
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 文件调用许多不同的函数。为了能够进入 "BeforeSendRequest" 方法, 我需要调用现有方法,例如:
m_MyService.XXX();
而且因为我在 "BeforeSendRequest" 中修改了它,所以我在这里调用哪个函数应该无关紧要。 但是,它确实 return 我的错误:
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();
时,它似乎不喜欢终于找到解决办法了,希望对你有帮助。我只需要修改 header 中的 "action"。所以只需添加这一行:
newReply.Headers.Action = "desiredcontent";