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

时间:2013-10-10 09:34:55

标签: multithreading wcf thread-safety wcf-extensions

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

这是一种相当常见的模式,如下所述:

Where to store data for current WCF call? Is ThreadStatic safe?

在这里:

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;会话:uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70; id = 2:线程ID:6

网站ID:test1450;会话:uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70; id = 3:主题ID:22

看起来wcf会在2个不同的线程上创建2个会话,但Site Id是相同的。它不应该。从这一点来看,它看起来像OperationContext.Current.Extensions是一个在线程之间共享的集合。 现在我倾向于认为我的测试是错误的,我错过了一些东西。

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

1 个答案:

答案 0 :(得分:11)

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

所以在这种情况下,他们线程安全。

请求由线程池提供,因此并发请求将具有不同的线程ID。 (直到线程池已满,然后请求将被置于保持状态)