Регистрация имени пользователя с помощью Elmah для веб-сервисов WCF - PullRequest
5 голосов
/ 12 октября 2010

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

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

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

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

и

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

Без успеха.

Есть какие-нибудь идеи о том, как заставить Элму записать имя пользователя?

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

Ответы [ 3 ]

4 голосов
/ 12 октября 2010

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

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

2 голосов
/ 21 февраля 2017

Это вопрос, который я вижу снова и снова. Хотя перекомпиляция кода возможна, я бы скорее предложил использовать функции, уже встроенные в 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();
    }
}
0 голосов
/ 20 ноября 2018

В качестве альтернативы перекомпиляции 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);
}
...