我正在对WCF服务进行代码审查。在每条消息的头中,我们注入服务稍后将用来构建到DB的连接字符串的数据。这是因为该服务将由许多不同的站点使用,每个站点都有自己的数据库,该服务必须查询这些数据库。我们使用wcf可扩展性。我们有一个自定义的MessageInspector,在收到请求后,从消息头中提取数据,创建上下文(实现IExtension)并将其添加到OperationContext.Current.Extensions中。在发送回复之前,将从Extencions集合中删除自定义上下文。
这是一个相当常见的模式,如下所述:
Where to store data for current WCF call? Is ThreadStatic safe?
还有这里:
只要服务接收请求、处理请求、发送应答并接收下一个请求,所有这些都可以很好地工作。但是,如果服务收到一个请求,并且在能够回复之前收到第二个请求,该怎么办呢?我构建了一个小的控制台应用程序来测试它。我从两个不同的线程发送了两条消息,我让wcf服务等待了2秒,以确保第二个请求在第一个请求完成之前到达,这是我得到的结果:
站点Id: uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70;id=2;会话: test1450 :线程Id :6
站点Id: uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70;id=3;会话: test1450 :线程Id : 22
看起来wcf创建了两个在两个不同线程上执行的会话,但站点Id是相同的。不应该。从这个角度看,OperationContext.Current.Extensions看起来像是一个线程间共享的集合。现在我倾向于认为我的测试是错误的,我遗漏了一些东西。
有没有人试过类似的东西,发现OperationContext.Current不是线程安全的?
发布于 2013-10-10 17:42:14
与HttpContext.Current等其他类似属性一样,OperationContext.Current也具有线程仿射(或线程静态)值。因此,它们是线程安全的,因为多个线程可以读取它们,但不同的线程将获得不同的实例。它们可以被认为是特定线程和实例之间的字典。
所以在这种情况下,它们不是线程安全的。
请求由线程池提供服务,因此并发请求将具有不同的线程ids。(在线程池已满之前,请求将被搁置)
https://stackoverflow.com/questions/19292135
复制相似问题