Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用CallContext存储WCF的HttpContext_C#_Wcf_Async Await_Callcontext - Fatal编程技术网

C# 使用CallContext存储WCF的HttpContext

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。基本上,这

我目前有一个WCF服务,用于执行一些数据库查询和发送邮件。长话短说,这两种方法都是异步的,在它们的实现中使用
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服务只有一个实例上下文,一次最多允许有一个线程处理实例上下文中的消息。希望使用相同实例上下文的其他线程必须阻塞,直到原始线程退出实例上下文

因此,在您对其进行代码更改并希望其实现之前,您所担心的似乎是不可能的。

有关更多详细信息,请参阅: