相当于存储在数据库中的Fiddler SOAP请求/响应

时间:2013-12-16 20:21:32

标签: wcf web-services soap

我为其他服务编写了很多WCF服务。我在让Fiddler记录SOAP消息之前遇到了麻烦,但现在我已经开始工作了。但是我的老板想要一些没有Fiddler的东西,我可以把SOAP消息输出,然后登录到数据库。我已经看了很多WCF日志记录和诊断,并使用数据库源监听器扩展它,但我找不到要使用的数据库源监听器的实现。

我认为这不是他想要的。他希望将Fiddler的SOAP请求/响应显示写入数据库。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

您有两种可能性:

  1. 编写自定义WCF Trace Listener,调用数据库过程来存储日志记录数据:

    public class AsyncMSMQTraceListener : TraceListener
    {
        public override void TraceData(TraceEventCache eventCache, string source,
                                       TraceEventType eventType, int id, object data)
        {
           // eventType like for example TraceEventType.Information
           var message = data.ToString();
    
           // Here call datbase save log with message              
        }
    
    
        public override void Write(string message)
        {
        }
    
        public override void WriteLine(string message)
        {
        }
    }
    

    但是通过这种方式,您将获得跟踪消息,其中请求/响应只是其中的一部分。

  2. 编写自定义Message Inspector类:

    public class ConsoleOutputMessageInspector : IDispatchMessageInspector
    {
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
            request = buffer.CreateMessage();
    
            // Here you can use buffer.CreateMessage().ToString()
    
            return null;
        }
    
        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
            reply = buffer.CreateMessage();
    
            // here you can use buffer.CreateMessage().ToString()
        }
    }
    
  3. 注意 :无论您选择哪种方法,我都建议对数据库进行某种异步调用,以阻止正常的服务流。