log4net, используя ThreadContext.Properties в сервисе wcf PerSession - PullRequest
5 голосов
/ 28 января 2012

Я бы хотел использовать следующее в моей службе wcf для входа пользователя в сообщение журнала:

log4net.ThreadContext.Properties["user"] = this.currentUser.LoginName;

У меня настроена служба для запуска в InstanceContextMode.PerSession. При первоначальном вызове службы wcf я устанавливаю это свойство ThreadContext для текущего пользователя, который вошел в систему, но каждый последующий вызов не регистрирует это свойство.

Я почти уверен, что при каждом вызове службы она запускает задачу в другом потоке, даже если она настроена на использование PerSession. Я предполагаю, что он использует пул потоков для обработки запросов.

Есть ли способ установить это так, чтобы мне не приходилось делать это в каждом методе wcf?

Ответы [ 2 ]

2 голосов
/ 06 марта 2014

Я столкнулся с той же проблемой, и вот как я получил его на работу.Вы можете использовать GlobalContext, так как он все равно будет оцениваться для каждого вызова.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService
{
    //static constructor
    static MyService()
    {
        log4net.Config.XmlConfigurator.Configure();
        log4net.GlobalContext.Properties["user"] = new UserLogHelper();
    }
    ...
}

Затем вам нужно определить простой класс:

private class UserLogHelper
{
    public override string ToString()
    {
        var instanceContext = OperationContext.Current.InstanceContext;
        var myServiceInstance = instanceContext.GetServiceInstance() as MyService;
        return myServiceInstance?.currentUser?.LoginName;
   }
}
1 голос
/ 03 февраля 2012

Log4net поддерживает «вычисленные значения контекста».Используя это, вы могли бы написать такой класс:

public class UserNameContext
{
    public override string ToString()
    {
        string userName = ...; // get the name of the current user

        return userName;
    }
}

Если вы добавите это в глобальный контекст, вы сможете получить доступ к свойству в ваших дополнениях (как вы привыкли).Метод ToString будет выполняться каждый раз, и поэтому вы получите правильное имя пользователя.

Подробнее о значениях контекста можно узнать из этого замечательного учебника: http://www.beefycode.com/post/Log4Net-Tutorial-pt-6-Log-Event-Context.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...