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());

有没有人知道,如果有一种方法来捕捉到底是什么出去(逐字),没有任何后处理如上所示?

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

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

对于传出的消息,日志记录在消息离开用户代码之后立即发生,在消息通过网络之前立即发生。

<system.diagnostics>
  <sources>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
                 <add name="messages"
                      type="System.Diagnostics.XmlWriterTraceListener"
                      initializeData="c:logsmessages.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>

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

然而,实现这种方法有点困难。您必须将标准textMessageEncoding包装为自定义绑定元素,并调整配置文件以使用该自定义绑定。

你也可以看到作为例子,我是如何做到这一点在我的项目-包装textMessageEncoding,日志编码器,自定义绑定元素和配置。

相关内容

  • 没有找到相关文章

最新更新