WCF Operation.Context不是线程安全的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (18)

我正在审查WCF服务的代码。在每封邮件的标题中,我们会注入该服务稍后将用于建立到DB的连接字符串的数据。这是因为服务将被许多不同的站点使用,每个站点都有自己的DB,服务必须查询。我们使用wcf可扩展性。我们有一个自定义MessageInspector,它在接收到请求后,从消息头中提取数据,创建一个上下文(实现IExtension)并将其添加到OperationContext.Current.Extensions中。在发送回复之前,自定义上下文将从Extencions集合中删除。

和这里:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/319cac66-66e8-4dfe-9a82-dfd289c9df1f/wcf-doesnt-have-session-storage-so-where-should-one-store-call-specific-data?forum=wcf

只要服务收到请求,处理它,发送回复并接收下一个请求,这一切都可以正常工作。但是如果服务收到请求并在能够回复请求之前又会得到第二个请求呢?我构建了一个小型控制台应用程序来测试它。我从2个不同的线程发送2条消息,我让wcf服务等待2秒,以确保第二个请求在第一个请求完成之前进入,这是我得到的:

网站ID:test1450; Session:uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70; id = 2:线程ID:6

网站ID:test1450; Session:uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70; id = 3:线程ID:22

它看起来像wcf创建2个会话在2个不同的线程上执行,但网站ID是相同的。它不应该。由此判断,它看起来像OperationContext.Current.Extensions是线程之间共享的集合。现在我倾向于认为我的测试错了,我错过了一些东西。

有没有人尝试类似的东西,发现OperationContext.Current不是线程安全的?

提问于
用户回答回答于

OperationContext.Current像其他类似的属性,如HttpContext.Current具有线程仿射(或线程静态)值。所以它们在多线程可以读取它们的意义上是线程安全的,但不同的线程会得到不同的实例。它们可以被认为是特定线程和实例之间的字典。

所以在这种情况下,它们不是线程安全的。

请求由线程池提供,因此并发请求将具有不同的线程ID。(直到线程池已满为止,那么请求将被搁置)

扫码关注云+社区