Hop*_*s13 17 wcf multithreading thread-safety wcf-extensions
我是代码审查WCF服务.在每条消息的标题中,我们注入服务稍后将用于构建到DB的连接字符串的数据.这是因为该服务将被许多不同的站点使用,每个站点都有自己的DB,服务必须查询.我们使用wcf扩展性.我们有一个自定义MessageInspector,在收到请求后,从消息头中提取数据,创建一个上下文(实现IExtension)并将其添加到OperationContext.Current.Extensions.在发送回复之前,将从Extencions集合中删除自定义上下文.
这是一种相当常见的模式,如下所述:
在哪里存储当前WCF呼叫的数据?ThreadStatic安全吗?
和这里:
只要服务收到请求,处理请求,发送回复并接收下一个请求,这一切都可以正常工作.但是,如果服务收到请求并且在能够回复之前获得第二个请求怎么办?我构建了一个小型控制台应用程序来测试它.我从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不是线程安全的?
aL3*_*891 12
与其他类似属性(如HttpContext.Current)一样,OperationContext.Current具有线程仿射(或线程静态)值.因此,在多线程可以读取它们的意义上它们是线程安全的,但是不同的线程将获得不同的实例.可以将它们视为特定线程和实例之间的字典.
所以在这种情况下,它们不是线程安全的.
请求由线程池提供,因此并发请求将具有不同的线程ID.(直到线程池已满,然后请求将被置于保持状态)
| 归档时间: |
|
| 查看次数: |
3358 次 |
| 最近记录: |