在哪里存储当前WCF呼叫的数据?ThreadStatic安全吗?

Syl*_*ain 54 wcf

当我的服务执行时,许多类将需要访问User.Current(这是我自己的User类).我可以安全地将_currentUser存储在[ThreadStatic]变量中吗?WCF是否重用其线程?如果是这种情况,它什么时候会清理ThreadStatic数据?如果使用ThreadStatic不安全,我应该把数据放在哪里?在OperationContext.Current中有一个地方可以存储那种数据吗?

编辑12/14/2009:我可以断言使用ThreadStatic变量是不安全的.WCF线程位于线程池中,并且ThreadStatic变量从不重新初始化.

Dar*_*rov 87

有一个博客帖子这表明实施的IExtension<T>.您也可以看一下这个讨论.

这是一个建议的实现:

public class WcfOperationContext : IExtension<OperationContext>
{
    private readonly IDictionary<string, object> items;

    private WcfOperationContext()
    {
        items = new Dictionary<string, object>();
    }

    public IDictionary<string, object> Items
    {
        get { return items; }
    }

    public static WcfOperationContext Current
    {
        get
        {
            WcfOperationContext context = OperationContext.Current.Extensions.Find<WcfOperationContext>();
            if (context == null)
            {
                context = new WcfOperationContext();
                OperationContext.Current.Extensions.Add(context);
            }
            return context;
        }
    }

    public void Attach(OperationContext owner) { }
    public void Detach(OperationContext owner) { }
}
Run Code Online (Sandbox Code Playgroud)

你可以这样使用:

WcfOperationContext.Current.Items["user"] = _currentUser;
var user = WcfOperationContext.Current.Items["user"] as MyUser;
Run Code Online (Sandbox Code Playgroud)

  • 对于.Net 4.5+,这种方法是否建议使用CallContext.LogicalGetData,CallContext.LogicalSetData? (5认同)