Проблема обнаружения службы WCF, требуется много времени для возврата результатов?

У меня есть серверная библиотека WCF и клиент [Winform], я запускаю сервер, используя winform с собственным хостом.

Я хочу, чтобы клиент мог обнаружить активные серверы в локальной сети, другим способом получить IP-адреса онлайн-серверов в списке. я попробовал DiscoveryClient и UdpDiscoveryEndpoint, и это сработало, вот код:

Клиент[Winform]:

 private void button1_Click(object sender, EventArgs e)
    {
        DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
        FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(IFileManager)));
        foreach (EndpointDiscoveryMetadata ep in findResponse.Endpoints)
        {
            listView1.Items.Add(ep.Address.ToString());
        }
    }   

Сервер[Winform]:

ServiceHost host = new ServiceHost(typeof(MainService));
private void button1_Click(object sender, EventArgs e)
    {
        if (button1.Text == "Start")
        {
            host.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
            host.AddServiceEndpoint(new UdpDiscoveryEndpoint());
            host.Open();
            button1.Text = "Stop";
        }
        else
        {
            host.Close();
            button1.Text = "Start";
        }
    }

but it didn't work like i expect it!

  • Why do i have to give a specific Criteria to ClientDiscovery ? i have many interfaces, i just need the host address, not the address of the interface!
  • it takes too much time [about 15-20s] to get the list, isn't suppose to be fast?

    ОБНОВЛЕНИЕ:
    Я разработал обнаружение сервера в сокетах TCP до того, как использовал WCF, я использовал параллельную поточность, которая пытается/поймать, чтобы подключиться и зациклиться на 255 IP-адресах, например: (192.168.1.X ), я попробовал это на серверах LAN 5 [ПК], результат был таким идеальным и быстрым, я выдержал тайм-аут (3 секунды)
    но на WCF я не знаю, как бы я это сделал !!

    введите здесь описание изображения


  • person Murhaf Sousli    schedule 03.05.2012    source источник


    Ответы (2)


    Почему я должен указывать определенные критерии для ClientDiscovery? у меня много интерфейсов, мне просто нужен адрес хоста, а не адрес интерфейса!

    В этом и заключается смысл разделения, тот факт, что все необходимые вам службы находятся на одном сервере, является деталью реализации. Тем не менее, вы можете связать своего клиента с вашей конкретной архитектурой, вручную создавая клиентов с информацией из MEX-адреса, полученного из первого результата процесса обнаружения.

    получение списка занимает слишком много времени [около 15-20 секунд], не должно быть быстро?

    Нет, обнаружение не должно быть быстрым, если вы ищете несколько экземпляров службы: время ожидания по умолчанию составляет 20 секунд. Теперь, если вам нужен только 1 экземпляр этой службы (что бывает в большинстве случаев), вы можете явно указать клиенту остановиться после обнаружения первой службы, установив для свойства MaxResults FindCriteria значение 1. Это намного быстрее, чем ожидание тайм-аута.

    Дополнительную информацию можно найти в этой отличной статье.

    ОБНОВЛЕНИЕ

    Вы можете установить время ожидания с помощью FindCriteria.Duration< /а> свойство.

    ОБНОВЛЕНИЕ 2

    Вся информация, которую вы можете получить об услуге, поступает через конечную точку MEX. Вы можете использовать MetadataExchangeClient с адресом MEX, полученным в результате обнаружения, и использовать информацию в наборе метаданных, который вы получите (см. http://msdn.microsoft.com/en-us/library/ms730243)..aspx, Получение метаданных службы), но я точно не знаю, какую информацию вы получите обратно, так как я никогда не использовал его таким образом.

    Это зависит от того, что вы подразумеваете под статусом: WS-discovery не имеет понятия о статусе, о котором я знаю, независимо от того, есть ли служба или нет. Любую другую интерпретацию этого понятия вы должны реализовать сами как операцию в своих сервисах.

    person Filippo Pensalfini    schedule 03.05.2012
    comment
    мне действительно нужно получить все онлайн-серверы, почему это должно быть медленным !! как насчет NetSupport, PcAnyWhere, некоторых многопользовательских игр ... я думаю, что это должно быть быстро, пожалуйста, посмотрите, я обновил свой вопрос. - person Murhaf Sousli; 03.05.2012
    comment
    у вас есть какие-либо идеи, как я могу позволить сервису обнаружения возвращать дополнительную информацию, такую ​​​​как имя компьютера и статус! - person Murhaf Sousli; 03.05.2012
    comment
    Ответ @MurHafSoz снова обновлен :) имейте в виду, что обнаружение службы не является обнаружением сервера: всю дополнительную работу или структуру, чтобы сделать его механизмом обнаружения сервера, вы должны реализовать самостоятельно. - person Filippo Pensalfini; 03.05.2012
    comment
    под статусом я подразумеваю настраиваемый дополнительный ответ, который я добавляю, например, если у этой службы уже есть подключенный клиент, он возвращает BUSY. - person Murhaf Sousli; 03.05.2012
    comment
    @MurHafSoz, тогда да, вам нужно реализовать для этого операцию, в которой вы проверяете, подключен ли уже клиент, используя ваше бизнес-определение подключения (например, последнее действие ‹ x секунды). - person Filippo Pensalfini; 03.05.2012
    comment
    спасибо за помощь :), я думаю, что это должен быть новый вопрос, чтобы узнать, как добавить пользовательскую операцию. - person Murhaf Sousli; 03.05.2012

    Если вы используете метод FindAsync() DiscoveryClient с событиями FindProgressChanged и FindCompleted, а не синхронный метод Find(), вы обнаружите, что событие FindProgressChanged срабатывает, как только приходят результаты конечной точки, а это означает, что вы будете иметь доступ к ним немедленно, а не приходится ждать окончания поиска. Вы поймете, что поиск окончен, когда сработает FindCompleted.

    Для меня требуется не более нескольких секунд, прежде чем все клиенты моей сети сообщат о событии FindProgressChanged, используя этот метод.

    Да, и если вам нужно отменить поиск по какой-либо причине (например, кто-то закрыл ваш диалог в середине поиска), тогда вызовите метод CancelAsync() DiscoveryClient.

    person Alex    schedule 09.02.2015
    comment
    Для меня этот ответ на самом деле отвечает на вопрос. Принятый ответ просто говорит, что ОП неверен без надлежащего объяснения. Обнаружение выполняется быстро, и использование методов синхронизации является причиной задержки ответа. - person David Ritchie; 14.04.2016
    comment
    @DavidRitchie Действительно. Однако я ответил на этот вопрос почти через 3 года после того, как он был задан, и принятый ответ уже был принят в то время. Многие люди не станут возвращаться назад и менять свои принятые ответы, когда появится лучший, поскольку их первоначальная проблема уже давно решена. Однако это нормально, я обычно публикую свои ответы, пытаясь помочь людям, а не ради очков. :) - person Alex; 14.04.2016