Как регистрировать содержимое сообщения WCF?

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>

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

Ответы

Ответ 1

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

Ответ 2

Только после этого описания отлично работает для меня: 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

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

Ответ 4

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