3

我有一个 WCF 服务器库和客户端 [Winform],我使用自托管 winform 启动服务器。

我想让客户端发现 LAN 上的活动服务器,以另一种方式获取列表中的在线服务器 IPAddresses。我试过了DiscoveryClientUdpDiscoveryEndpoint它起作用了,这是代码:

客户端[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";
        }
    }

但它没有像我预期的那样工作!

  • 为什么我必须给 ClientDiscovery 一个特定的标准?我有很多接口,我只需要主机地址,而不是接口的地址!
  • 获取列表需要花费太多时间 [大约 15-20 秒],不是应该很快吗?

    更新:
    在我使用 WCF 之前,我已经在 TCP 套接字上开发了一个服务器发现,我使用了 try/catch 的并行线程来连接和循环 255 个 IP 地址,例如:(192.168.1.X),我在 LAN 5 服务器上尝试过[ PC],结果是如此完美和快速,我坐了一个超时(3 秒)
    ,但在 WCF 上我不知道我将如何完成这个!

    在此处输入图像描述

  • 4

    2 回答 2

    4

    如果您将DiscoveryClient'FindAsync()方法与FindProgressChangedandFindCompleted事件一起使用而不是同步Find()方法,您会发现FindProgressChanged一旦端点结果进来,事件就会被触发,这意味着您可以立即访问它们,而不必等待搜索的结束。FindCompleted当火灾发生时,您会知道搜索结束。

    FindProgressChanged对我来说,我的网络的所有客户端都使用此方法通过事件进行报告,只需要几秒钟的时间。

    哦,如果您出于任何原因需要取消搜索(例如,有人在搜索过程中关闭了您的对话框),请调用DiscoveryClient'sCancelAsync()方法。

    于 2015-02-09T06:14:45.007 回答
    4

    为什么我必须给 ClientDiscovery 一个特定的标准?我有很多接口,我只需要主机地址,而不是接口的地址!

    这就是解耦的重点,您需要的所有服务都在单个服务器上这一事实是一个实现细节。也就是说,您可以将您的客户端耦合到您的特定架构,使用从发现过程的第一个结果收到的 MEX 地址中的信息手动创建客户端。

    获取列表需要花费太多时间 [大约 15-20 秒],不是应该很快吗?

    不,如果您正在寻找服务的多个实例,则发现不应该很快:默认超时为 20 秒。现在,如果您只需要该服务的一个实例(大多数情况下),那么您可以通过将 FindCriteria 的 MaxResults 属性设置为 1 来明确告诉客户端在找到第一个服务后停止。这比等待超时。

    有关更多信息,您可以查看这篇出色的文章

    更新

    您可以通过FindCriteria.Duration属性设置超时。

    更新 2

    您可以通过 MEX 端点获得有关该服务的所有信息。您可以将 MetadataExchangeClient 与您从发现中获得的 MEX 地址一起使用,并使用您返回的 MetadataSet 中的信息(请参阅http://msdn.microsoft.com/en-us/library/ms730243.aspx,检索服务元数据),但我不确定你会得到什么样的信息,因为我从来没有这样使用过。

    这取决于您所说的状态是什么意思:WS-discovery 没有我所知道的状态概念,无论服务是否存在。对此概念的任何其他解释,您必须将自己实现为服务中的操作。

    于 2012-05-03T07:55:04.163 回答