2010-10-12 15 views
5

Estamos utilizando el enfoque descrito here para registrar los errores de servicio web con Elmah. Y esto realmente funciona, pero lamentablemente el nombre de usuario registrado está vacío.nombre de usuario Inicio de sesión con Elmah para servicios web WCF

Realizamos algunas depuraciones y encontramos que al registrar el error en el Manejador de errores, el HttpContext.Current.User tiene el conjunto de Usuario correcto.

También probamos:

HttpContext context = HttpContext.Current; 
ErrorLog.GetDefault(context).Log(new Error(pError, context)); 

y

ErrorLog.GetDefault(null).Log(new Error(pError)); 

sin éxito.

Cualquier ideas sobre cómo podemos hacer Elmah ingrese el nombre de usuario?

En una nota, cuando la tala de error directamente en el servicio web, el nombre de usuario se registra como se esperaba. Pero tomar este enfoque no es muy SECO.

Respuesta

4

Elmah tomar el usuario de Thread.CurrentPrincipal.Identity.Name y no de HttpContext.Current.User.

Dado que no hay una forma conveniente de agregar datos personalizados a Elmah, sugiero recompilar el código y llamar a HttpContext.Current.User en su lugar.

+0

Estoy en lo cierto que al establecer la Pricipal con: 'Thread.CurrentPrincipal = new GenericPrincipal (nueva GenericIdentity ("lala"), nueva cadena [0])' es una mala idea debido a ThreadPooling? – Thomas

+0

Sí, no quiere meterse con el hilo principal –

+0

y si lo configuro de nuevo en el antiguo principal después de registrar el error con elmah? – Thomas

2

Esta es una pregunta que veo una y otra vez. Aunque volver a compilar el código es una posibilidad, prefiero sugerir el uso de funciones integradas en ELMAH, como se explica en mi entrada de blog Enrich ELMAH errors using error filtering hook.

En su caso, establecer la propiedad User en todos los errores, se puede lograr mediante la adición de la ErrorLog_Filtering -method:

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args) 
{ 
    var httpContext = args.Context as HttpContext; 
    if (httpContext != null) 
    { 
     var error = new Error(args.Exception, httpContext); 
     error.User = httpContext.User.Identity.Name; 
     ErrorLog.GetDefault(httpContext).Log(error); 
     args.Dismiss(); 
    } 
} 
Cuestiones relacionadas