Регистрация имени пользователя с помощью Elmah для веб-служб WCF

Мы используем подход, описанный здесь для регистрации наших ошибки веб-сервиса с Elmah. И это действительно работает, но, к сожалению, зарегистрированное имя пользователя пусто.

Мы выполнили некоторую отладку и обнаружили, что при регистрации ошибки в ErrorHandler HttpContext.Current.User имеет правильный пользовательский набор.

Мы также пробовали:

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

и

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

Безуспешно.

Есть идеи, как заставить Elmah регистрировать имя пользователя?

Кстати, при регистрации ошибки непосредственно в веб-сервисе имя пользователя регистрируется, как и ожидалось. Но такой подход не очень СУХОЙ.


person Thomas    schedule 12.10.2010    source источник


Ответы (3)


Эльма берет пользователя из Thread.CurrentPrincipal.Identity.Name, а не из HttpContext.Current.User.

Поскольку нет удобного способа добавить пользовательские данные в Elmah, я бы предложил перекомпилировать код и вместо этого вызвать HttpContext.Current.User.

person Shay Erlichmen    schedule 12.10.2010
comment
Правильно ли я, что установка Pricipal с помощью: `Thread.CurrentPrincipal = new GenericPrincipal (new GenericIdentity (lala), new string [0]) '- плохая идея из-за пула потоков? - person Thomas; 12.10.2010
comment
И если я верну его к старому принципалу после регистрации ошибки с помощью elmah? - person Thomas; 12.10.2010

Это вопрос, который я вижу снова и снова. Хотя повторная компиляция кода возможна, я бы предпочел использовать функции, уже встроенные в ELMAH, как описано в моем сообщении в блоге Обогатите ошибки ELMAH с помощью ловушки для фильтрации ошибок.

В вашем случае установка свойства User для всех ошибок может быть достигнута добавлением ErrorLog_Filtering-метода:

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();
    }
}
person ThomasArdal    schedule 21.02.2017

В качестве альтернативы перекомпиляции Elmah мы можем использовать глобальный метод, который заполняет Thread.CurrentPrincipal.Identity.Name перед вызовом elmah.

public static void LogError(Exception exception, string username)
{
    Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(username), new string[] {});
    Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
}
person jdimko    schedule 20.11.2018