我正在开发的一个小型分布式应用程序中发生了一个奇怪的情况。
问题
考虑N
我要部署相同 Web 服务的服务器:
[ServiceContract()]
public interface IWS {
int GetInt(int n);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyWS : IWS {
public MyWS() { /* ... */ }
public int GetInt(int n) { /* ... */ }
}
Web 服务MyWS
将部署在 8 个站点上。我在 IIS 7.0 上使用相同的端口但不同的应用程序根在本地执行此操作。所以在我的一台服务器上http://localhost:12000/Srv1/MySvc.svc
,而另一台可以http://localhost:12000/Srv4/MySvc.svc
,依此类推。
呼叫被路由
考虑该方法int GetInt(int n)
是一种可以为同一方法调用另一个 Web 服务的方法。实际上发生的情况是呼叫int GetInt(int n)
被路由,直到到达目的地。请不要打扰这个细节,重要的是要了解调用是路由的,所以调用是嵌套的,直到一个被执行到服务器中,执行后返回回复,直到原始调用者得到它的回复。
当一个MyWS
Web 服务想要调用另一个MyWS
Web 服务时,它使用以下代码:
public int GetInt(int n) {
/* ... */
if (/* a condition for routing the call */) {
// Call another ws
IWS svc = null;
ServiceEndpoint endpoint = new ServiceEndpoint(
ContractDescription.GetContract(typeof(IWS)),
new BasicHttpBinding(),
new EndpointAddress(/* addr of the other server */));
ChannelFactory<IWS> factory = new ChannelFactory<IWS>(endpoint);
factory.Open();
svc = factory.CreateChannel();
int res = svc.GetInt(n); // <======== HERE
/* ... */
} else {
// Execute the method here!!!
/* ... */
}
/* ... */
}
问题
问题是什么?当我尝试int n
从某个电台路由特定的呼叫时,该呼叫永远不会返回!挡住了!!!但是,如果我尝试从同一站但参数不同的呼叫,OK!
实际上,我尝试使用调试器并能够跟踪调用链。问题是当调用链在最后一个服务器之前到达一个服务器时,调试器会在我放置<======= HERE
标记的那一行停止!虽然该行对于先前的调用成功,但在最后一次到达服务器时,调试器无法进入调用并在那里等待无限时间(在绑定配置中我设置了 12 小时超时)。
我知道没有太多关于这个问题的信息。我只是想知道是否有人对这个问题有一些想法。考虑到我已经尝试检查这是否是关于 的问题Instance
,但我有这样的Multiple
行为,所以调用不应该阻塞,顺便说一句,为什么其他调用不阻塞???