servicios - wcf vs web api
Correlación de seguimiento de extremo a extremo de MSMQ con seguimiento de WCF y registro de nivel de aplicación (3)
Fondo:
Estoy solucionando un problema donde los mensajes enviados por WCF sobre MSMQ transaccional (con netMsmqBinding) parecen desaparecer. El código que usa WCF está en un ensamblado de un tercero que no puedo cambiar. Tengo pocas pistas sobre cuál es el problema, pero planifico habilitar varias capacidades de rastreo para determinar dónde se basa el problema.
Contexto:
He habilitado el seguimiento de extremo a extremo de MSMQ. Registra dos eventos por cada mensaje que se envía.
- Un evento cuando se escribe un mensaje en la cola saliente. Este mensaje contiene el id. De mensaje de MSMQ (que está compuesto por un guid y un entero, es decir, 7B476ADF-DEFD-49F2-AF5A-0CF27C5152C0 / 6481271).
- Otro evento cuando ese mensaje se envía a través de la red.
He habilitado el seguimiento detallado de WCF .
También tengo el registro de nivel de aplicación que registra los ID de mensaje definidos por el código de la aplicación (llamémoslo "ID del mensaje de la aplicación").
He habilitado el diario de origen positivo y negativo en los mensajes de MSMQ que se envían.
He habilitado el diario en la cola de recepción.
Problema:
Cuando faltan mensajes, sé el ID de la aplicación del mensaje que falta (está registrado por el lado que envía). Ahora me gustaría ver el seguimiento de extremo a extremo para ver si el mensaje se escribió en la cola saliente o no.
¿Cómo puedo relacionar los eventos en el seguimiento de extremo a extremo con los registros de nivel de aplicación y los rastreos de WCF?
Ideas:
Al enviar un mensaje de MSMQ utilizando la API de MSMQ administrada en System.Messaging, la identificación de MSMQ del mensaje está disponible después de enviar el mensaje. Sin embargo, no he encontrado una forma de registrar esto cuando WCF está realizando la operación de envío. El seguimiento de WCF registra un guid de MSMQMessageId, pero este valor es, sorprendentemente, no el ID de MSMQ real como suponía que sería. ¿Es posible acceder al ID del mensaje MSMQ real y registrarlo?
Registre el id. De hebra nativa en el registro de la aplicación junto con el id. De nivel de la aplicación y una marca de tiempo. El ID de subproceso nativo se registra en el rastreo de extremo a extremo por MSMQ, por lo que esto podría ser suficiente para establecer una correlación. Este es el plan B para mí si no encuentro una solución más elegante.
Parece que estás en el camino correcto. Sin embargo, podrías subir un poco con esto:
Usando SvcConfigEditor.exe
- Configure WCF Verbose Tracing para Propagate ACtiveity y Activity tracing
- Configure WCF MessageLogging para "mensajes mal formados, mensajes de servicio, mensajes de transporte"
Use LogEntireMessage
De extremo a extremo, trace todo
Asegúrese de habilitar estos * .config en AMBOS lados, el suyo y el ejecutable de terceros.
Recoja sus archivos de registro y agréguelos TODOS a SvcTraceViewer.exe
Parece que su mensaje está siendo descartado por WCF porque está mal formado de algún modo (es decir, falta de coincidencia de contrato, se ha excedido uno de los límites de tamaño de mensaje de WCF).
Para atrapar este error, puede escribir un ErrorHanlder que audita estos errores. Aquí un link a una muestra de hacer eso.
Otra opción, si usa Win 2008 R2 y superior, es utilizar el manejo integrado de mensajes tóxicos. aquí hay un link a los documentos.
A la pregunta , para rastrear de extremo a extremo con un identificador de rastreo de aplicación: pasaría la identificación de seguimiento de la aplicación en el encabezado del mensaje ( mire aquí para ver un ejemplo ).
Para auditar el encabezado del mensaje en el lado del servicio, usaría IOperationInvoker
de WCF para interceptar cada llamada y auditarla en el encabezado del mensaje.
Esto se puede configurar en el archivo de configuración para el proceso sin alterar el código de terceros. here`s un ejemplo de cómo implementar un invocador y cómo configurarlo en config.
Puede configurar Windows MSMQ para detectar sujetos de mensajes y si los sujetos contienen una palabra clave iniciar una aplicación. Esta aplicación puede registrar mensajes entrantes. En el lado del remitente, puede escribir la identificación del mensaje real en el asunto del mensaje y agregar su palabra clave al asunto. En la aplicación disparada del lado del receptor puede acceder a la identificación del mensaje real cerca de la palabra clave agregada en el asunto.