为什么WCF发现Udp通道被中止

时间:2011-03-16 16:16:41

标签: wcf discovery

我希望服务器使用WCF Discovery不断跟踪可用的客户端。

        public void Start()
        {
            findCriteria = new FindCriteria(typeof(ITestRunnerAgent))
                               {
                                   Scopes = {new Uri(scope)},
                                   Duration = TimeSpan.FromMilliseconds(DiscoveryIntervalInMiliseconds)
                               };
            discoveryClient = GetInitilizedDisoveryClient();
            discoveryClient.FindAsync(findCriteria);
        }

        private DiscoveryClient GetInitilizedDisoveryClient()
        {
            var client = new DiscoveryClient(new UdpDiscoveryEndpoint());
            client.FindProgressChanged += OnFindProgressChanged;
            client.FindCompleted += OnFindCompleted;
            return  client;
        }

        private void OnFindCompleted(object sender, FindCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                // HERE! Sometimes e.Error is not null, but as described in question
                discoveryClient.FindAsync(findCriteria);
            }
        }

不幸的是,有时在评论指定的点上我会获得一个中止的Udp频道:

  

通讯对象,   System.ServiceModel.Channels.UdpChannelFactory + ClientUdpDuplexChannel,   不能用于沟通   因为它已被中止。

有没有人想过为什么?

3 个答案:

答案 0 :(得分:0)

可能是您办公室的某些网络基础设施正在断开连接。

您应编写代​​码以检查中止的通信,并从中恢复。

要恢复,您可以关闭已中止的频道并创建一个新频道。

答案 1 :(得分:0)

嗯,这不能回答你的问题,但我对你的代码有点担心。这似乎从根本上说是正确的,但感觉你的发现可能会非常快。我会在一个单独的线程中实现重复发现,只需要一些睡眠时间,以使网络更快乐。只是想清理代码。对不起,如果这没有帮助。

  public void Start()
  {
    var bw = new System.ComponentModel.BackgroundWorker();
    bw.DoWork += new System.ComponentModel.DoWorkEventHandler(DiscoveryThread);
    bw.RunWorkerAsync();
  }
  private void DiscoveryThread(object sender, System.ComponentModel.DoWorkEventArgs e)
  {
    var client = new DiscoveryClient(new UdpDiscoveryEndpoint());
    var findCriteria = new FindCriteria(typeof(ITestRunnerAgent))
                        {
                            Scopes = {new Uri(scope)},
                            Duration = TimeSpan.FromMilliseconds(DiscoveryIntervalInMiliseconds)
                        };
    while(true)
    {
      client.Find(findCriteria);
      // lock, clear, and add discovered endpoints to a global List of some sort
      System.Threading.Thread.Sleep(3000);
    }
  }

答案 2 :(得分:0)

由于它是异步操作,因此线程在执行FindAsync(criteria)方法后终止。只是在方法调用后写入Console.Readline()或使用Autoreset事件保持线程。