【问题标题】:Replay log using WCF technology使用 WCF 技术重播日志
【发布时间】:2016-06-22 16:07:44
【问题描述】:

我需要使用 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”中对其进行了修改,所以我在这里调用哪个函数并不重要。 但是,它确实返回了错误:

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”的实例
  • 嗯,我不确定我是否理解正确“xxx”是一种方法。如果我打电话给 m_MyService.YYY();首先它会起作用,但只有在 BeforeSendRequest 中加载的方法是 m_MyService.YYY();如果我调用 YYY 以外的任何其他方法,它将失败。

标签: .net wcf iclientmessageinspector


【解决方案1】:

我终于找到了解决方案,希望它可以帮助。我只需要修改标题中的“动作”。所以只需添加这一行:

newReply.Headers.Action = "desiredcontent";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 2019-12-02
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2018-06-23
    • 2021-10-06
    • 2010-09-25
    相关资源
    最近更新 更多