尝试使用MessageInspector在wcf服务之前通过代理修改消息。但是,在调试邮件正文时,不会复制并显示正文
<s:Body>... stream ...</s:Body>
代码有什么问题?
public class CustomWCFMessageInspector : IClientMessageInspector
{
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
request = ModifyMessage(request);
return null;
}
private Message ModifyMessage(Message oldMessage)
{
Message newMessage = null;
MessageBuffer msgbuf = oldMessage.CreateBufferedCopy(int.MaxValue);
Message tmpMessage = msgbuf.CreateMessage();
XmlDictionaryReader xdr = tmpMessage.GetReaderAtBodyContents();
XDocument xd = ConvertToXDocument(xdr);
EmitTags(xd);
var ms = new MemoryStream();
var xw = XmlWriter.Create(ms);
xd.Save(xw);
xw.Flush();
xw.Close();
ms.Position = 0;
XmlReader xr = XmlReader.Create(ms);
newMessage = Message.CreateMessage(tmpMessage.Version, null, xr);
newMessage.Headers.CopyHeadersFrom(tmpMessage);
newMessage.Properties.CopyProperties(tmpMessage.Properties);
return newMessage;
}
}
答案 0 :(得分:19)
这是解决方案: 如果你调用Message.ToString(),你将得到
.. ..流
而是使用System.Xml.XmlWriter。这是一个示例:
MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
Message msg = buffer.CreateMessage();
StringBuilder sb = new StringBuilder();
using (System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(sb))
{
msg.WriteMessage(xw);
xw.Close();
}
Console.WriteLine("Message Received:\n{0}", sb.ToString());
答案 1 :(得分:14)
问题是在执行ToString()之后,在监视窗口中没有显示newMessage主体
创建要在调试器中显示的消息的缓冲副本。
MessageBuffer messageBuffer = newMessage.CreateBufferedCopy(int.MaxValue);
Message message = messageBuffer.CreateMessage();
代码中有没问题。只是调试器没有显示下面链接中提到的消息体
http://msdn.microsoft.com/en-us/library/ms734675(v=VS.90).aspx
在访问邮件正文进行调试部分。
答案 2 :(得分:1)
我怀疑ToString会返回你得到的东西。 ToString通常用于调试,因此仅显示有关该对象的基本信息。你需要在ConvertToXDocument中做这样的事情:
XDocument x = XDocument.Load(xdr);