我正在开发的一个小型分布式应用程序中发生了一种奇怪的情况。
考虑我想部署相同Web服务的N
服务器:
[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
网络服务想要调用另一个MyWS
网络服务时,它会使用以下代码:
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
的呼叫时,该呼叫永远不会返回!它阻止!!!但是,如果我尝试从同一个电台拨打电话但不同的参数,那就好了!
实际上我尝试使用调试器并且能够跟随调用链。问题是当调用链在最后一个服务器之前到达一个服务器时,调试器停在我放置<======= HERE
标记的行!虽然该行在之前的调用中成功,但在最后一次到达服务器之前,调试器无法进入调用并在那里等待无限时间(在绑定配置中我设置为12小时超时)。
我知道有关此问题的信息不多。
我只是想知道是否有人对这个问题有一些想法。
考虑到我已经尝试检查它是否是Instance
的问题,但是我有Multiple
行为所以调用不应该阻塞,顺便说一下,为什么其他调用不会阻塞? / p>