Как записать содержимое сообщения WCF? - PullRequest
21 голосов
/ 08 ноября 2011

enter image description here

Я подумал, что это будет просто, но я не понимаю, как сказать WCF регистрировать тела сообщений.У меня есть:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel" switchValue="Verbose">
      <listeners>
        <add type="System.Diagnostics.DefaultTraceListener" name="Default">
          <filter type="" />
        </add>
        <add type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EntLibLoggingProxyTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging"
          name="traceListener">
          <filter type="" />
        </add>
      </listeners>
    </source>
  </sources>
</system.diagnostics>
<system.serviceModel>
   <diagnostics>
     <messageLogging logEntireMessage="true" logMalformedMessages="true"
       logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" />
   </diagnostics>
   ...etc..,
   ...etc...
</system.Model>
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
   <listeners>
     <add fileName="_trace-xml.log"
                listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.XmlTraceListenerData,Microsoft.Practices.EnterpriseLibrary.Logging"
                traceOutputOptions="None"
                type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.XmlTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging"
        name="XML Trace Listener" />      
     ...etc... other listeners
  </listeners>
  ...etc...
</loggingConfiguration>

Но все, что я получаю, это сообщения о сообщении, а не тело сообщения.Что мне нужно изменить, чтобы регистрировать содержимое сообщения?

Ответы [ 5 ]

34 голосов
/ 09 ноября 2011

Просто следование этому описанию прекрасно работает для меня: http://msdn.microsoft.com/en-us/library/ms730064.aspx

<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="false"
     logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="false"
     maxMessagesToLog="3000"
     maxSizeOfMessageToLog="2000"/>
</diagnostics>
</system.serviceModel>

Нет необходимости писать код для этого ...

3 голосов
/ 17 ноября 2013

Я обнаружил проблему с версиями. Когда проект WCF Service был построен на .Net 3.5, я увидел полное тело сообщения в средстве просмотра. Встроенный против .Net 4.0 Я не видел тела сообщения.

1 голос
/ 10 октября 2014

Попробуйте http://www.csharptutorial.in/12/csharp-net-wcf-how-to-enable-wcf-tracing-and-messagelogging и настройте logMessagesAtTransportLevel = "true".В вашем журнале вы можете найти теги <s:Body>.Исследуйте текст рядом с ними.Позже вы можете добавить новый «XmlListener» и найти тело сообщения в более гибком формате.

1 голос
/ 08 ноября 2011

Если вам нужны тела сообщений, вам придется захватывать их самостоятельно, программно. Используйте служебное поведение для установки инспектора сообщений и захвата сообщений внутри вашей реализации IDispatchMessageInspector или IClientMessageInspector.

0 голосов
/ 02 сентября 2018

Можно рассмотреть другой способ просмотра XML SOAP - пользовательский MessageEncoder . Основное отличие от аналогичного IDispatchMessageInspector / IClientMessageInspector заключается в том, что он работает на более низком уровне, поэтому он захватывает исходное содержимое байта, включая любой искаженный xml.

Чтобы реализовать трассировку с использованием этого подхода, необходимо обернуть стандартное textMessageEncoding с пользовательским кодировщиком сообщений в качестве нового связующего элемента и применить эту пользовательскую привязку к конечная точка в вашей конфигурации .

Также вы можете видеть в качестве примера, как я это сделал в своем проекте - упаковка textMessageEncoding, регистрация кодер , пользовательская привязка элемент и config .

...