Почему канал WCF Discovery Udp прерывается - PullRequest
0 голосов
/ 16 марта 2011

Я хочу, чтобы сервер постоянно отслеживал доступные клиенты с помощью 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 голосов
/ 18 августа 2011

Ну, это не отвечает на ваш вопрос, но я немного настороженно отношусь к вашему коду.Это кажется в корне правильным, но кажется, что ваше открытие может быть очень быстрым.Я бы реализовал повторяющееся обнаружение в отдельном потоке с некоторым временем ожидания, чтобы сделать сеть более счастливой.Просто мысль, чтобы очистить код.Извините, если это не поможет.

  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 голосов
/ 19 августа 2014

Поскольку это асинхронная операция, поток завершается после выполнения метода FindAsync (критерий).только что написал Console.Readline () после вызова метода или используйте событие Autoreset для удержания потока.

0 голосов
/ 18 марта 2011

Возможно, какая-то сетевая инфраструктура в вашем офисе прерывает соединение.

Вы должны написать свой код для проверки прерванной связи и восстановления после нее.

Для восстановления вы можете закрыть прерванный канал и создать новый.

...