1

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

我最初的问题是,在第一个await,之后HttpContext.Current变为 null ,因此第二个操作失败。我在 Google 上搜索了几个小时,并测试了我发现的所有内容......自定义同步上下文,web.config 中的 appSettings,针对 .NET 4.5,启用 ASP.NET 兼容性,但没有任何效果。

然后,我发现这个 SO 帖子谈论CallContext. 基本上,这个想法是存储HttpContext.CurrentCallContext. 我测试并且yeepee,它的工作。但是,由于我不知道确切是什么CallContext,所以我阅读了它。

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

我想人们会很想告诉我只CallContextCallContext是次要的。

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

4

2 回答 2

1

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

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

于 2018-09-13T23:00:25.830 回答
1

WCF 在某种程度上是一个完整的 SOA 架构,提供给您开箱即用的多种协议支持,并且所有内容都是可配置的,此外您还可以扩展自定义所有内容。所以得到所有是非常棘手的。只是基础知识:

三种类型的 WCF并发是:

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

多个:在这种情况下,WCF 服务对象可以在任何给定时刻处理多个请求。

可重入:单个请求线程可以访问 WCF 服务对象,但线程可以退出 WCF 服务调用另一个 WCF 服务,也可以通过回调调用 WCF 客户端重新进入而不会死锁。

看起来很简单,但等待它具有与并发不同的实例 模式

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

- 每个会话为每个新的客户端会话创建一个新的 InstanceContext(以及因此服务对象),并在该会话的生命周期内维护(这需要支持会话的绑定)。

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

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

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

因此,除非您为此进行了代码更改并希望它发生,否则您所担心的似乎是不可能的。

更多详情请参考:MSDN

于 2018-09-14T05:45:35.037 回答