C# 使用CallContext存储WCF的HttpContext
我目前有一个WCF服务,用于执行一些数据库查询和发送邮件。长话短说,这两种方法都是异步的,在它们的实现中使用C# 使用CallContext存储WCF的HttpContext,c#,wcf,async-await,callcontext,C#,Wcf,Async Await,Callcontext,我目前有一个WCF服务,用于执行一些数据库查询和发送邮件。长话短说,这两种方法都是异步的,在它们的实现中使用HttpContext.Current 我最初的问题是,在第一个wait之后,HttpContext.Current变为null,因此第二个操作失败。我在谷歌上搜索了几个小时,我测试了我找到的所有东西。。。自定义同步上下文,web.config中的appSettings,目标为.NET 4.5,启用ASP.NET兼容性,但没有任何效果 然后,我发现谈论的是CallContext。基本上,这
HttpContext.Current
我最初的问题是,在第一个wait
之后,HttpContext.Current
变为null,因此第二个操作失败。我在谷歌上搜索了几个小时,我测试了我找到的所有东西。。。自定义同步上下文,web.config中的appSettings,目标为.NET 4.5,启用ASP.NET兼容性,但没有任何效果
然后,我发现谈论的是CallContext
。基本上,这个想法是将HttpContext.Current
存储在CallContext
中。我测试和重剑,成功了。然而,由于我不知道什么是CallContext
,我读到了它
我不确定我是否真正理解了所有的事情,但在我阅读之后,我有一个担忧。我可能错了,但似乎不能保证异步调用完成后恢复的线程与初始线程相同。问题是我在HttpContext
中存储了几个值,我担心第一个方法使用用户A值执行,然后,异步调用完成后,第二个方法使用用户B值执行(因为HttpContext
将不一样)
我想人们会想告诉我只在CallContext
中存储这些值,但在面对WCF问题之前,我创建了一个完整的体系结构,所以我不想完全回顾它,这就是为什么CallContext
很方便,因为变化很小
有人能告诉我我的理论是否正确吗?您应该更改您的服务,以便它们不依赖于
HttpContext.Current
。最好不要依赖于HttpContext
HttpContext.Current
是UI线程的服务器端等价物。只是不要在不需要依赖它的代码上使用它 WCF是一种全新的SOA体系结构,具有多种协议支持&一切都是可配置的,此外,您还可以扩展和自定义一切。因此,获取所有信息是非常棘手的。只是一些基本信息:
WCF并发性的三种类型是:
Single:单个请求在给定时刻可以访问WCF服务对象
Multiple:在这种情况下,WCF服务对象可以在任何给定时刻处理多个请求
可重入性:单个请求线程可以访问WCF服务对象,但该线程可以退出WCF服务以调用另一个WCF服务,或者也可以通过回调调用WCF客户端并在没有死锁的情况下重入
看起来很简单,但wait有不同于并发的实例化模式:
-每次调用都会为每个客户端请求创建一个新的InstanceContext(因此服务对象)
-每个会话为每个新的客户端会话创建一个新的InstanceContext(因此服务对象),并在该会话的生命周期内进行维护(这需要支持会话的绑定)
-单个实例:单个InstanceContext(因此也是服务对象)处理应用程序生命周期内的所有客户端请求
默认实例模式为每个会话,默认并发模式为单个
这意味着,在您更改服务之前,WCF服务只有一个实例上下文,一次最多允许有一个线程处理实例上下文中的消息。希望使用相同实例上下文的其他线程必须阻塞,直到原始线程退出实例上下文
因此,在您对其进行代码更改并希望其实现之前,您所担心的似乎是不可能的。
有关更多详细信息,请参阅: