首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CallContext存储WCF的HttpContext

使用CallContext存储WCF的HttpContext
EN

Stack Overflow用户
提问于 2018-09-13 08:11:58
回答 2查看 481关注 0票数 1

我目前有一个WCF服务,用于执行一些数据库查询和发送邮件。长话短说,这两种方法都是异步在实现中使用HttpContext.Current的。

我最初的问题是,在第一个await之后,HttpContext.Current变为null,因此第二个操作失败。我在谷歌上搜索了几个小时,我测试了我发现的一切.自定义同步上下文中的appSettings在web.config中以.NET 4.5为目标,启用了ASP.NET兼容性,但没有工作。

然后,我发现这是如此的帖子在谈论CallContext。基本上,我们的想法是将HttpContext.Current存储在CallContext中。我做了测试,然后再尿尿,效果很好。然而,由于我不知道确切的CallContext是什么,我读到了它。

我不确定我是否真的正确地理解了一切,但是在我读完之后,我有一个担忧。我可能错了,但似乎无法保证异步调用完成后恢复的线程与初始线程相同。问题是,我在HttpContext中存储了几个值,而且我担心第一个方法使用用户A值执行,然后,一旦异步调用完成,第二个方法将使用用户B值执行(因为HttpContext将不是相同的)。

我想人们会很想告诉我,只将这些值存储在CallContext中,但是在遇到WCF问题之前,我创建了一个完整的体系结构,所以我不想完全回顾它,这就是为什么CallContext会派上用场,因为变化很小。

有人能告诉我我的理论是否正确吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-14 05:45:35

WCF是某种程度上完整的SOA体系结构,支持多种协议&除了扩展之外,一切都是可配置的,您还可以扩展、定制所有东西。因此,获得一切都是非常tricky.Just的基础:

三种类型的WCF 并发是:

:一个请求在给定的时刻可以访问WCF服务对象。

多重:在这个场景中,WCF服务对象可以在任何给定的时刻处理多个请求。

可重入:单个请求线程可以访问WCF服务对象,但是线程可以退出WCF服务来调用另一个WCF服务,也可以通过回调调用WCF客户端并在不死锁的情况下重新进入。

看起来很简单,但是等待它有实例模式,这与并发性不同。

-每个调用为每个客户端请求创建新的InstanceContext (因此也是服务对象)。

-每个会话为每个新的客户端会话创建新的InstanceContext (因此也是服务对象),并在该会话的生存期内进行维护(这需要支持会话的绑定)。

-单实例:一个InstanceContext (因此是服务对象)在应用程序的生存期内处理所有客户端请求。

默认实例模式为每个会话,默认并发模式为单个

这意味着在更改WCF服务之前,您的服务只有一个实例上下文,允许每次在实例上下文中最多有一个线程处理消息。希望使用相同实例上下文的其他线程必须阻塞,直到原始线程退出实例上下文为止。

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-09-13 23:00:25

您应该更改您的服务,以使它们不依赖于HttpContext.Current。最好完全不依赖HttpContext

HttpContext.Current是相当于UI线程的服务器端。只是不要在不需要依赖它的代码上使用它。

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

https://stackoverflow.com/questions/52309331

复制
相关文章

相似问题

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