C#WCF - 创建自定义消息内容

时间:2016-04-08 09:47:56

标签: c# xml wcf

我一直在使用可用的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> 

我的自定义内容目前位于字符串中。

1 个答案:

答案 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值的数据。