自定义客户端MessageInspector记录请求但不记录响应

时间:2014-01-14 21:39:03

标签: wcf

我有一个Custom ClientMessageInspector,它记录请求但不回复我的服务。

代码是:

namespace MessageListener.Instrumentation
{
    public class MessageInspector : IClientMessageInspector
    {

        private Message TraceMessage(MessageBuffer buffer)
        {
            // Must use a buffer rather than the original message, because the Message's body can be processed only once.
            Message msg = buffer.CreateMessage();

            using (RREM_GilbaneEntities3 entities3 = new RREM_GilbaneEntities3())
            {
                SOAPMessage soapMessages = new SOAPMessage
                {
                    SOAPMessage1 = msg.ToString(),
                    created = DateTime.Now,
                    source = "Interface12",
                    sourceIP = "Interface12"
                };
                entities3.SOAPMessages.Add(soapMessages);
                entities3.SaveChanges();
            }

            //Return copy of origonal message with unalterd State
            return buffer.CreateMessage();
        }

        public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {
            reply = TraceMessage(reply.CreateBufferedCopy(int.MaxValue));
        }

        public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
        {
            request = TraceMessage(request.CreateBufferedCopy(int.MaxValue));
            return null;
        }
    }
}

似乎正在发生的事情是调用AfterRecievReply和BeforeSendRequest。在我调用TraceMessage之前的AfterRecieveReply中,我可以看到整个回复。在TraceMessage里面,当我这样做时:

// Must use a buffer rather than the original message, because the Message's body can be processed only once.

        Message msg = buffer.CreateMessage();

它将回复变成了垃圾:

msg {<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header />
  <soap:Body>... stream ...</soap:Body>
</soap:Envelope>}

发生了什么事?

1 个答案:

答案 0 :(得分:1)

回复不是垃圾邮件 - 只是当您在其上调用ToString时它没有显示邮件的正文。请记住,消息只能被消费一次;一旦读完它的身体,它就不能再读了。由于许多地方(包括调试器的监视窗口)将在一个对象上调用ToString,因此该方法的实现方式是,如果它不能确定多次读取消息体,那么它就不会,这似乎是你的情况。如果您想真正写出消息,请尝试使用以下代码:

public string MessageToString(Message message) {
    using (MemoryStream ms = new MemoryStream()) {
        XmlWriterSettings ws = new XmlWriterSettings();
        ws.Encoding = new UTF8Encoding(false);
        using (XmlWriter w = XmlWriter.Create(ms)) {
            message.WriteMessage(w);
            w.Flush();
            return ws.Encoding.GetString(ms.ToArray());
        }
    }
}
相关问题