.net - WCF ExceptionShielding Error ID no coincide con handlingInstanceId pasado a Handler
enterprise-library fault (2)
Tengo los siguientes decorados en mi servicio
<ExceptionShielding("MyExceptionPolicyName")>
cuando se lanza una excepción de falla, mi política detecta el error y se conecta muy bien. Toma el Identificador de instancia de manejo y lo registra junto con el error como referencia. Lo que estoy notando es que el Guid devuelto en la falla "Id. De error:" es diferente al que se pasó al ID de instancia de manejo.
También traté de decorar la operación como tal
<FaultContract(GetType(ValidationFault))>
pero esto produce los mismos resultados.
Lo que me gustaría hacer es cómo capturar ese "Error ID:" pasado al consumidor para que pueda iniciar sesión junto con la excepción. * información adicional: el controlador de política de excepción es uno personalizado que toma una excepción y registra sus diversas propiedades y datos en un esquema de registro de excepción específico db.
Alguien sabe cómo lograr esto?
ACTUALIZACIÓN: por el comentario de @Jay Patel, agregué esto a mi configuración para permitir el seguimiento
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:/Temp/Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
Luego ejecuté una solicitud para obtener una respuesta de falla protegida por protección de excepción. La cadena de respuesta a fallas tiene el siguiente formato: "Ocurrió un error al consumir este servicio. Comuníquese con su administrador para obtener más información. ID de error: {GUID}"
Luego miré el registro de seguimiento y no encontré evidencia del GUID o esta cadena.
Aquí está el enlace pastebin al registro de seguimiento para cualquier persona que quiera ver un ejemplo de uno cuando use ExceptionShielding.
ACTUALIZACIÓN2:
Nuevamente, por el comentario de @Jay Patel, agregué esto. Intenté -1 y el valor int máximo para maxMessageLog para asegurarme de obtener la mayor cantidad de datos en ese registro.
<diagnostics>
<messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="2147483647" />
</diagnostics>
El registro no es útil. No incluye nada acerca de nada, incluso cerca de responder mi pregunta.
Para aclarar en caso de que no esté claro más arriba ... Quiero poder capturar el GUID después del "Id. De error:" en el mensaje de vuelta al cliente para poder registrarlo con la excepción que registra el manejador de excepciones. De esta forma, los clientes pueden ponerse en contacto con el "Administrador" tal como aparece en el mensaje con el ID de error y, de hecho, ser capaces de encontrar algo.
Aquí está el rastro completo habilitado pastbin
¿El registro de mensajes será útil? Si es así, supongo que necesitas algo como esto en tu configuración:
<source name ="System.ServiceModel.MessageLogging"
switchValue="Verbose, ActivityTracing">
<listeners>
<add name="xml" />
</listeners>
Tenga en cuenta que el nombre de la fuente aquí es ''System.ServiceModel.MessageLogging'' y no ''System.ServiceModel''.
Para ver el ejemplo completo, consulte este artículo: http://msdn.microsoft.com/en-us/library/dd788183.aspx
Espero que esto te ayudará.
De acuerdo con http://msdn.microsoft.com/en-us/library/ff649012.aspx :
También puede especificar una Fuente de "{Guid}" para agregar la ID de la Instancia de gestión actual a la propiedad del Contrato de falla.
En su archivo .config:
<mappings>
<add source="{Guid}" name="HandlingInstanceId" />
</mappings>
En su ValidationFault FaultContract:
[DataMember]
public Guid HandlingInstanceId { get; set; }
Nota: La fuente "{Guid}" parece ser un marcador especial para la ID de la instancia de manejo.
Ver también: http://entlib.codeplex.com/discussions/232049
Y, las últimas 2 entradas: http://entlib.codeplex.com/discussions/243558