wcf PerSession服务中使用ThreadContext.Properties的log4net

我想在wcf服务中使用以下命令在日志消息中记录用户:

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

我已将服务设置为在InstanceContextMode.PerSession中运行.在对wcf服务的初始调用中,我将此ThreadContext属性设置为已登录的当前用户,但每个后续调用均未记录此属性.

我很确定,即使设置为使用PerSession,对于服务的每次调用,它也会在不同的线程上运行任务.我假设它正在使用线程池来处理请求.

有没有一种方法可以设置这个,这样我就不必在每个wcf方法中都这样做?

最佳答案
我遇到了同样的问题,这就是我如何使其工作的原因.您可以使用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;
   }
}

转载注明原文:wcf PerSession服务中使用ThreadContext.Properties的log4net - 代码日志