2010-05-19 10 views
6

Estoy usando IErrorHandler para manejar excepciones en WCF y ahora quiero registrar las excepciones, junto con el seguimiento de la pila y el usuario que causó la excepción.Excepciones de registro en WCF con IErrorHandler dentro de HandleError o ProvideFault?

La única manera que puedo ver a conseguir que el usuario que causó la excepción es:

OperationContext.Current.IncomingMessageProperties.Security.ServiceSecurityContext.PrimaryIdentity

... Pero esto sólo parece funcionar dentro ProvideFault , y no dentro de HandleError. ¿Hay alguna forma de que el usuario entre a HandleError? Me gustaría utilizar HandleError en lugar de ProvideFault, ya que se llama a un hilo de fondo y está destinado para el registro de errores, ¿no?

responsabilidades

Respuesta

3

Los dos métodos de la IErrorHandler han bastante bien definidos:

  • HandleError está aquí para manejar todas las excepciones no capturadas - es por eso que es el mejor lugar para hacer su registro - que es realmente toda su razón ser

  • ProvideFault tiene la tarea de convertir su excepción de .NET en un error de SOAP interoperables - o ignorar la excepción alltogether

Por supuesto, técnicamente no hay nada que te impida hacer tu registro en el método ProvideFault - simplemente no es el lugar donde buscaría esa funcionalidad si alguna vez tuviera que buscarla. Me suele gustar seguir el principio de menor sorpresa: si el método se llama ProvideFault, solo espero que proporcione un FaultException<T>; tampoco hago muchas otras cosas.

para obtener acceso al contexto de seguridad de su servicio, utilice este fragmento de código:

ServiceSecurityContext secCtx = ServiceSecurityContext.Current; 

if(secCtx.PrimaryIdentity != null) 
{ 
    // do something with primary identity 
} 
+0

Estoy de acuerdo, pero ¿cómo se consigue la información del usuario (ServiceSecurityContext.PrimaryIdentity) desde el interior del método HandleError? – Dannerbo

+0

@Dannerbo: actualizó mi respuesta –

+8

En mi entorno, el acceso a ServiceSecurityContext.Current en HandleError() arroja ObjectDisposedException con el texto "Message is closed". – UserControl

Cuestiones relacionadas