如何在 WCF 自动发现中获取 IP 地址

How to get IP address in WCF Auto Discovery

我添加了以下功能来自动发现 Intranet 中的 WCF 服务。

private void AutoDiscovery(FindCriteria cirteria)
{
    try
    {
        UdpDiscoveryEndpoint udp = new UdpDiscoveryEndpoint();
        using (DiscoveryClient discoveryClient = new DiscoveryClient(udp))
        {
            cirteria.Duration = TimeSpan.FromSeconds(5);
            FindResponse response = discoveryClient.Find(cirteria);
            if (response.Endpoints.Count > 0)
            {
                foreach (EndpointDiscoveryMetadata point in response.Endpoints)
                {
                    string address = point.Address.Uri.ToString();
                    // net.tcp//computer1:8081/wcfService
                }
            }
        }
    }
    catch(Exception e)
    {

    }
}

测试时,return地址为net.tcp//computer1:8081/wcfService。虽然我可以使用 Dns.GetHostAddress 获取 ip 地址,但由于 DNS 问题,在本地 Intranet 中需要很长时间。
有什么发现的时候可以直接获取ip地址吗?

我认为你的想法是最好的解决方案,使用DNS.GetHostAddress来获取服务器的实际IP地址。它应该只能由域名系统来完成。 DiscoveryClient仅return服务器端定义的服务端点地址,仅适用于控制台应用程序托管的服务。

<service name="ConsoleApp3.TestService">
        <!--the below service endpoint address is returned as defined here-->
        <endpoint address="http://10.157.13.69:6666" binding="wsHttpBinding" contract="ConsoleApp3.ITestService" ></endpoint>
        <!--this line code will return domain-->
        <!--<endpoint address="http://vabqia969vm:6666" binding="wsHttpBinding" contract="ConsoleApp3.ITestService"></endpoint>-->
        <!--for exposing the service-->
        <endpoint kind="discoveryEndpoint" address="http://10.157.13.69:6666/exterior" binding="wsHttpBinding" ></endpoint>
      </service>

对于托管在IIS 中的服务,无论站点绑定的类型如何,都只return 域名。在这种情况下,我们只能利用DNS了。

foreach (EndpointDiscoveryMetadata item in response.Endpoints)
            {
                //retrieve IP address
                System.Net.IPHostEntry hostinfo = System.Net.Dns.GetHostEntry(item.Address.Uri.Host);
                string IPAddress = hostinfo.AddressList[2].ToString();
                Console.WriteLine(IPAddress);
            }

如果有什么我可以帮忙的,请随时告诉我。