WCF IClientMessageInspector记录有关操作的差异

时间:2015-07-13 10:24:01

标签: wcf iclientmessageinspector

我正在从我的应用程序中记录传出的WCF Soap请求,并发现我正在记录的内容与通过网络实际发送到服务器的内容之间存在差异。

以下是我正在记录的内容:

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/myinterface</Action>
 </s:Header>
 <s:Body>
    <myinterface xmlns="http://tempuri.org/">
    ...

以下是实际发布的内容(使用WireShark捕获):

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
   <myinterface xmlns="http://tempuri.org/">
   ...

您会注意到WireShark捕获没有Header或Action元素。

我只是注意到了这一点,因为我尝试通过SoapUI推送我的记录请求。

我正在使用此代码记录请求:

public class InspectorBehavior : IEndpointBehavior
{
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(new WCFMessageInspector());
    }

public class WCFMessageInspector : IClientMessageInspector
{ 
    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
    {
        Log(request.ToString());

        return null;
    }

    client.Endpoint.Address = new System.ServiceModel.EndpointAddress(address);
    client.Endpoint.Behaviors.Add(new InspectorBehavior());

有没有人知道是否有办法准确捕捉到的内容(逐字),而不进行如上所示的任何后期处理?

2 个答案:

答案 0 :(得分:0)

您可以在App.config中配置WCF Message Logging,以便在传输级别记录消息。

这应该尽可能晚地捕获消息:

  

对于传出消息,在消息离开用户代码之后立即进行记录,并且在消息传输之前立即进行记录。

<system.diagnostics>
  <sources>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
                 <add name="messages"
                      type="System.Diagnostics.XmlWriterTraceListener"
                      initializeData="c:\logs\messages.svclog" />
        </listeners>
      </source>
    </sources>
</system.diagnostics>

<system.serviceModel>
  <diagnostics>
        <messageLogging 
         logEntireMessage="true" 
         logMalformedMessages="true"
         logMessagesAtServiceLevel="false" 
         logMessagesAtTransportLevel="true"
         maxMessagesToLog="1000"
         maxSizeOfMessageToLog="1000000"/>
  </diagnostics>
</system.serviceModel>

答案 1 :(得分:0)

您可以通过 custom MessageEncoder 捕获确切的内容,与消息检查器(IDispatchMessageInspector / IClientMessageInspector)不同,它可以看到原始字节内容,包括任何格式错误的XML数据。

但是,要实现此方法要困难一些。您必须将标准textMessageEncoding包装为自定义binding element,并调整config文件以使用该自定义绑定。

您还可以作为示例查看我在项目中的操作方式-wrapping textMessageEncoding,记录encoder,自定义绑定elementconfig