我一直在使用可用的IClientMessageInspector(和IDispatchMessageInspector)检查基于WCF的系统中发送的消息。
目前我正在尝试手动将XML添加到邮件中,我无法让它工作。
情况: 传入消息具有类似
的正文<s:Body>
<Type xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
...
</Type>
</s:Body>
我想用自定义内容替换整个主体,手动结构化为字符串。即,我在字符串中有一个正确的XML主体,我希望将其放在消息正文中。
这甚至可能吗?
编辑: 为了进一步澄清这个问题:我可以以某种方式访问&#34;原始文本&#34;消息,并编辑它?
Edit2:I.e。我想保留原始标题和所有来自传入的消息,但想要替换
之间的所有内容<body> </body>
我的自定义内容目前位于字符串中。
答案 0 :(得分:1)
您可以使用类似于此博文https://blogs.msdn.microsoft.com/kaevans/2008/01/08/modify-message-content-with-wcf/
中的方法简而言之,您可以添加EndpointBehavior
添加自定义MessageInspector
:
Service1Client proxy = new Service1Client();
proxy.Endpoint.Behaviors.Add(new MyBehavior());
public class MyBehavior : IEndpointBehavior
{
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
MyInspector inspector = new MyInspector();
clientRuntime.MessageInspectors.Add(inspector);
}
}
public class MyInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
var xml = "XML of Body goes here";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
XmlDictionaryReader xdr = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas());
Message replacedMessage = Message.CreateMessage(reply.Version, null, xdr);
replacedMessage.Headers.CopyHeadersFrom(reply.Headers);
replacedMessage.Properties.CopyProperties(reply.Properties);
reply = replacedMessage;
}
}
编辑:已添加MemoryStream
来自string
值的数据。