¿Cómo registrar el contenido del mensaje WCF?

enter image description here

Pensé que esto sería simple, pero no veo cómo decirle a WCF que registre los cuerpos de los mensajes. Yo tengo:

<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>

Pero todo lo que consigo registrar son cosas sobre el mensaje, no el cuerpo del mensaje. ¿Qué necesito cambiar para registrar el contenido del mensaje?

preguntado el 08 de noviembre de 11 a las 13:11

5 Respuestas

Solo seguir esta descripción funciona perfectamente para mí: 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>

No es necesario escribir ningún código para eso ...

respondido 09 nov., 11:02

Si hago esto, obtengo toneladas de información sobre lo que está haciendo WCF, pero nada sobre el contenido de los mensajes: - Chris F Carroll

grrr. De todos modos, lo anterior intenta demostrar que el elemento svclog para 'acción de proceso' getBlah 'la entrada' envió un mensaje a través de un canal 'no registra el mensaje en cuestión, sino que solo tiene un vacío y no MessageBody ni nada por el estilo. Otros elementos de seguimiento, como "se escribió un mensaje" y "se recibió una respuesta Http, tampoco contienen información de mensaje". No estoy seguro de cómo publicar una captura de pantalla. - Chris F Carroll

Captura de pantalla publicada, aunque necesitaría varias para demostrar que ninguno de los registros de seguimiento contiene un cuerpo de mensaje. Después de haber pasado algún tiempo ayer buscando en Google, tuve la impresión de que JohnC tenía razón y que algo como msdn.microsoft.com/en-us/library/… fue la solución que los blogs tendían a imitar. Estoy en Net3.5 si hace una diferencia - Chris F Carroll

Bien: confirmo que la pestaña Mensajes (en la parte superior izquierda del grupo de pestañas Actividad, Proyecto, Mensaje, Gráfico) ESTÁ vacía. (Como es la pestaña Mensaje en la parte inferior derecha del grupo de pestañas Formatted-Xml-Message). Podríamos suponer que logEntireMessage solo funciona en VS2010 / .Net 4; y simplemente no funciona en Vs2008 / .Net 3; y es por eso que hay una gran cantidad de blogs y un artículo de la revista MS sobre la ruta indicada por la respuesta de JohnC. O hay algo crucial que me he perdido; pero tengo la misma configuración que ha indicado en su respuesta y no me funciona. - Chris F Carroll

Esto funciona. Es posible que desee aumentar maxSizeOfMessageToLog - C

Encontré un problema de control de versiones. Cuando el proyecto del servicio WCF se compiló con .Net 3.5, vi el cuerpo completo del mensaje en la herramienta del visor. Construido contra .Net 4.0 No vi el cuerpo del mensaje.

respondido 17 nov., 13:17

¡Ahhh tan irritante! ¡Este parece ser! .. uno de esos "solo lo necesitas cuando algo sale mal". - Paul Hutchinson

A las personas que tienen problemas con esto en .Net 4.0. Preste atención, el rastreo es: <source name="System.ServiceModel"> Los mensajes son: <source name="System.ServiceModel.MessageLogging"> stackoverflow.com/questions/11264260/… - Jeremy Thompson

Trata http://www.csharptutorial.in/12/csharp-net-wcf-how-to-enable-wcf-tracing-and-messagelogging y configure logMessagesAtTransportLevel = "true". En su archivo de registro puede encontrar <s:Body> etiquetas. Investiga el texto cerca de ellos. Más tarde, puede agregar un nuevo "XmlListener" y encontrar el cuerpo del mensaje en un formato más flexible.

Respondido 13 Oct 14, 10:10

Si necesita cuerpos de mensajes, tendrá que capturarlos usted mismo, mediante programación. Utilice un comportamiento de servicio para instalar un inspector de mensajes y capturar mensajes dentro de su implementación de IDispatchMessageInspector o IClientMessageInspector.

respondido 08 nov., 11:18

Pobre de mí. Entonces, algo como este blog wcfpro.wordpress.com/2011/03/29/iclientmessageinspector Dame todo ¿Necesito o hay más que necesito saber en términos de configuración o código para registrar cuerpos de mensajes? - Chris F Carroll

Ese enlace es prácticamente todo lo que necesitas. Lo único que no muestra es cómo instalar el comportamiento del extremo, que es bastante fácil (endpoint.Behaviors.Add). - JohnC

Esta respuesta es incorrecta. Configurar una fuente para System.ServiceModel.MessageLogging y un oyente para registrar los mensajes funciona bien para mí. No se requiere un inspector de mensajes. - Volumen W.

¡Incorrecto! Como dijo @TomW, simplemente puede configurar una fuente para recibir el mensaje. - Bruno Brant

Para otros que se inclinan a llamar mal esta respuesta y afirman que todo simplemente funciona en la configuración, los remito a la respuesta de @RichardHowells: “Encontré un problema de versiones. Cuando el proyecto del servicio WCF se compiló con .Net 3.5, vi el cuerpo completo del mensaje en la herramienta del visor. Construido contra .Net 4.0 No vi el cuerpo del mensaje ". - Chris F Carroll

Puede considerar otra forma de ver XML SOAP: MessageEncoder personalizado. La principal diferencia con IDispatchMessageInspector / IClientMessageInspector similares es que funciona en un nivel inferior, por lo que captura el contenido de bytes original, incluido cualquier XML con formato incorrecto.

Para implementar el seguimiento con este enfoque, debe ajustar un estándar textMessageEncoding con codificador de mensajes personalizados como nuevo elemento vinculante y aplique ese enlace personalizado al punto final en su config.

También puedes ver como ejemplo cómo lo hice en mi proyecto - envase textMessageEncoding, registro codificador, encuadernación personalizada elementos y config.

Respondido el 02 de Septiembre de 18 a las 18:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.