如何在WCF Web服务上捕获soap消息?

时间:2014-10-21 08:19:00

标签: c# .net web-services wcf

我有一个wcf网络服务。我在db上记录错误。我的错误日志表包含ErrorMessage,Date,LogLevel等字段。我还需要记录soap消息。如何在服务中捕获响应并请求soap消息?

编辑:我正在使用log4net库进行日志记录。

3 个答案:

答案 0 :(得分:1)

如果您想“捕获”并在WCF服务的“最外层”边缘记录应用程序消息,那么您应该考虑实现IDispatchMessageInspector,这将启用对入站/出站服务消息的自定义检查。

以下MSDN链接提供了IDispatchMessageInspector的概述,它引用了您的方案:

  

实施IDispatchMessageInspector以检查或修改入站或   在分派请求之前出站应用程序消息   消息到操作或在将回复消息返回给a之前   呼叫者。有许多场景需要   在调用它所针对的操作之前拦截消息   注定。例如,您可以记录传入的应用程序消息或   根据邮件标题执行某些功能。

http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.idispatchmessageinspector(v=vs.110).aspx

或者,您可以考虑将WCF跟踪日志记录与自定义数据库跟踪侦听器结合使用。通过这种方式,WCF将跟踪数据提供给自定义侦听器,该侦听器可以插入到数据库中。

http://msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx

答案 1 :(得分:1)

为了以可靠的方式拦截所有请求和响应,您必须实施BehaviorExtensionElement我已经回答了如何在此thread

中实现它

你所能做的就是这样的事情

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
 {

       //here you can  create a buffered message as the original message can accessed only once 
           //MemoryStream stream = new MemoryStream();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = System.Text.Encoding.UTF8;
            StringWriter sw = new StringWriter();
            XmlWriter writer = XmlWriter.Create(sw, settings);





            MessageBuffer buffer = request.CreateBufferedCopy(int.MaxValue);
            //Create a copy of the message in order to continue the handling of te SOAP                 
            request = buffer.CreateMessage();
           request.WriteMessage(writer);
          //Recreate the message 
             writer.Flush();
            //Flush the contents of the writer so that the stream gets updated
             //you can log the str to the database 
            var str =  sw.ToString();

            request = buffer.CreateMessage();


  }

答案 2 :(得分:0)

我很确定你必须通过创建自己的使用log4net管理器的监听器来组合ASP.NET系统诊断组件和log4net。

在您的网络配置中,查看<system.diagnostics>部分和<sharedListeners>。在我的情况下,我们将完整的请求/响应记录到文件中。

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="d:\soap.svclog" />
    </sharedListeners>
  </system.diagnostics>