WCF Web服务无法访问但控制冻结服务调用

时间:2013-06-27 11:27:15

标签: c# .net wcf web-services

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

问题

考虑我想部署相同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>

0 个答案:

没有答案