0

我正在开发的一个小型分布式应用程序中发生了一个奇怪的情况。

问题

考虑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)被路由,直到到达目的地。请不要打扰这个细节,重要的是要了解调用是路由的,所以调用是嵌套的,直到一个被执行到服务器中,执行后返回回复,直到原始调用者得到它的回复。

当一个MyWSWeb 服务想要调用另一个MyWSWeb 服务时,它使用以下代码:

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行为,所以调用不应该阻塞,顺便说一句,为什么其他调用不阻塞???

4

0 回答 0