为什么 WCF Discovery Udp 通道被中止

问题描述 投票:0回答:3

我希望服务器使用 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, 不能用于通讯 因为它已经被中止了。

有人知道为什么吗?

wcf wcf-discovery
3个回答
0
投票

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

您应该编写代码来检查中止的通信并从中恢复。

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


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);
    }
  }

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.