首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在哪里存储当前WCF调用的数据?ThreadStatic安全吗?

在哪里存储当前WCF调用的数据?ThreadStatic安全吗?
EN

Stack Overflow用户
提问于 2009-12-13 14:22:16
回答 3查看 21.6K关注 0票数 55

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

编辑2009年12月14日:我可以断言,使用ThreadStatic变量是不安全的。WCF线程在线程池中,ThreadStatic变量永远不会重新初始化。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-13 17:00:59

有一个博客post建议实现一个IExtension。你也可以看看这个discussion

下面是一个建议的实现:

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) { }
}

你可以像这样使用:

WcfOperationContext.Current.Items["user"] = _currentUser;
var user = WcfOperationContext.Current.Items["user"] as MyUser;
票数 90
EN

Stack Overflow用户

发布于 2018-12-07 01:31:53

不需要添加额外驱动类的替代解决方案。

    OperationContext operationContext = OperationContext.Current;
    operationContext.IncomingMessageProperties.Add("SessionKey", "ABCDEFG");

获取值的步骤

var ccc = aaa.IncomingMessageProperties["SessionKey"];

就这样

票数 1
EN

Stack Overflow用户

发布于 2016-10-21 15:43:14

我发现当我们使用多线程切换进行异步调用时,我们会遗漏数据或当前上下文。要处理这样的场景,您可以尝试使用CallContext。它应该在.NET远程处理中使用,但它也应该在这样的场景中工作。

设置CallContext中的数据:

DataObject data = new DataObject() { RequestId = "1234" };
CallContext.SetData("DataSet", data);

从CallContext检索共享数据的

var data = CallContext.GetData("DataSet") as DataObject;

// Shared data object has to implement ILogicalThreadAffinative

public class DataObject : ILogicalThreadAffinative
{
  public string Message { get; set; }
  public string Status { get; set; }
}

为什么选择ILogicalThreadAffinative ?

当对另一个AppDomain中的对象进行远程方法调用时,当前的CallContext类将生成一个LogicalCallContext,该a将随对远程位置的调用一起传播。

只有公开ILogicalThreadAffinative接口并存储在CallContext中的对象才会在AppDomain外部传播。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1895732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档