我们的wcf服务参考文献之一使用螺纹变量。服务方法在每个呼叫的开头设置其值。我想知道这是否是安全的 - 换句话说,我们是否可以保证将完全使用一个线程用于整个通话?还是有可能在一个工人线程上开始呼叫并在另一个工人的线程上结束?或者可以将工人线程换成其他方法调用,然后再次返回?
我们正在使用concurrencymode.single和instancecontextmode.plesession的默认值。
编辑
到目前为止,我唯一能够找到的信息是这篇博客文章,该文章可能会通过多个线程处理呼叫:
http://blogs.microsoft.co.il/blogs/applisec/archive/2009/11/11/11/23/wcf-thread-affility-and-synchronization.aspx
这个家伙正确吗?Microsoft是否有任何确定的信息?
如果您不确定可以始终使用CallContext类:CallContext.LogicalSetDataCallContext.LogicalGetData
虽然线程确实更改了线程,但逻辑callContext在.NET中传递,即使您将创建自己的新线程/任务。
您正在谈论的现象可以在多个请求之间传递单个请求,称为"线程敏捷性"。
简短的答案是,不,您不能保证 将通过一个线程处理给定的请求。
请参阅此处可接受的答案:WCF请求处理线程敏捷?
*是由IIS托管的WCF
这是我一所大学的回应:
您引用的"这个家伙"一定是错误的。没有办法在执行实际执行中要更改的线程服务方法。任何方法都是如此,并且与WCF无关。
可以创建一个异步调用,然后在另一个方法/线程;但这没什么特别的:http://tao.qshine.com/note/threadissue.html
我当然会非常有兴趣听到此线程敏捷性是否与方法调用切换线程…我们正在谈论托管线程在这里,微软没有理由更改线程ID。CallContext是Microsoft提供的功能,以便您可以存储状态如果您执行异步电话。
可能有可能实例上下文使用不同的线程实例化服务多于执行方法 - 尽管如果您使用percall,则将没有发生。您真的在使用会议吗?如果不是,你应该切换去percall。在同一中可能有不同的呼叫会话将使用其他线程。
似乎很有意义。有评论吗?
我有保存问题。为了调查我开始负载测试并开始测试GetRolesForuser:
public override bool IsUserInRole(string username, string roleName)
{
object stub = new object();
bool res;
lock(stub)
{
RoleProviderCount++;
ThreadId = Thread.CurrentThread.ManagedThreadId;
res = GetRolesForUser(username).Contains(roleName);
}
return res;
}
这是我的日志:
Timestamp: 06.11.2012 13:55:03 Message: ServiceCalls count 1; RoleProvider count 1 Thread Id 9
Timestamp: 06.11.2012 14:00:22 Message: ServiceCalls count 1; RoleProvider count 1 Thread Id 9
Timestamp: 07.11.2012 5:30:38 Message: ServiceCalls count 1; RoleProvider count 1 Thread Id 11
Timestamp: 07.11.2012 5:31:58 Message: ServiceCalls count 1; RoleProvider count 4 Thread Id 27
Timestamp: 07.11.2012 5:31:58 Message: ServiceCalls count 1; RoleProvider count 4 Thread Id 27
Timestamp: 07.11.2012 5:31:58 Message: ServiceCalls count 1; RoleProvider count 4 Thread Id 27
Timestamp: 07.11.2012 5:31:58 Message: ServiceCalls count 1; RoleProvider count 4 Thread Id 27
Timestamp: 07.11.2012 5:31:58 Message: ServiceCalls count 1; RoleProvider count 4 Thread Id 27
Timestamp: 07.11.2012 5:31:58 Message: ServiceCalls count 1; RoleProvider count 4 Thread Id 27
Timestamp: 07.11.2012 5:31:59 Message: ServiceCalls count 1; RoleProvider count 5 Thread Id 22
Timestamp: 07.11.2012 5:31:59 Message: ServiceCalls count 1; RoleProvider count 8 Thread Id 26
Timestamp: 07.11.2012 5:31:59 Message: ServiceCalls count 1; RoleProvider count 8 Thread Id 26
Timestamp: 07.11.2012 5:32:00 Message: ServiceCalls count 1; RoleProvider count 10 Thread Id 23
Timestamp: 07.11.2012 5:32:00 Message: ServiceCalls count 1; RoleProvider count 11 Thread Id 29
Timestamp: 07.11.2012 5:32:00 Message: ServiceCalls count 1; RoleProvider count 12 Thread Id 22
Timestamp: 07.11.2012 5:32:00 Message: ServiceCalls count 1; RoleProvider count 13 Thread Id 27
Timestamp: 07.11.2012 5:32:00 Message: ServiceCalls count 1; RoleProvider count 14 Thread Id 24
Timestamp: 07.11.2012 5:32:00 Message: ServiceCalls count 1; RoleProvider count 15 Thread Id 30
Timestamp: 07.11.2012 5:32:00 Message: ServiceCalls count 1; RoleProvider count 16 Thread Id 26
Timestamp: 07.11.2012 5:32:01 Message: ServiceCalls count 1; RoleProvider count 17 Thread Id 11
Timestamp: 07.11.2012 5:32:01 Message: ServiceCalls count 1; RoleProvider count 18 Thread Id 23
Timestamp: 07.11.2012 5:32:01 Message: ServiceCalls count 1; RoleProvider count 20 Thread Id 26
Timestamp: 07.11.2012 5:32:01 Message: ServiceCalls count 1; RoleProvider count 20 Thread Id 26
Timestamp: 07.11.2012 5:32:01 Message: ServiceCalls count 1; RoleProvider count 21 Thread Id 24
因此,从同一线程调用了roleprovider方法。(WCF服务配置实例模式percall,并发多重)