c# - WCF 服务发现问题,需要多长时间才能返回结果?

标签 c# wcf service-discovery

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

我想让客户端发现 LAN 上的事件服务器,以另一种方式获取列表中的在线服务器 IP 地址。我尝试了 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 提供特定条件?我有很多接口(interface),我只需要主机地址,而不是接口(interface)地址!
  • 获取列表的时间太长了[大约15-20s],应该不会很快吧?

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

    enter image description here

  • 最佳答案

    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!

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

    it takes too much time [about 15-20s] to get the list, isn't suppose to be fast?

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

    有关更多信息,您可以查看此 excellent article .

    更新

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

    更新 2

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

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

    关于c# - WCF 服务发现问题,需要多长时间才能返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10426485/

    相关文章:

    c# - 依赖注入(inject) - 将参数传递给构造类型

    c# - 为带有子文件夹的 ASP.NET MVC 区域路由生成 URL

    c# - 在 LINQ 中选择计数

    c# - 如何获取 WCF Web 服务的 IP 地址

    java - 使用 Android 扫描 LAN 网络的最佳方式

    google-compute-engine - 从Cloud Compute实例连接到Kubernetes服务

    C# System.InvalidOperationException : The current TransactionScope is already complete

    asp.net - 通过 HTTPS 和 HTTP 访问时 WCF 服务不工作

    wcf - 可以做些什么来加快同步 WCF 调用?

    java - 如何推迟Spring应用程序在Eureka中的注册,直到应用程序完全初始化?