繁体   English   中英

如何获取WCF服务正在侦听的端口?

[英]How can I get the port that a WCF service is listening on?

我有一个net.tcp WCF服务,我希望操作系统选择它应该监听的端口。 所以我在我的URI中将端口设置为0, netstat确认操作系统已经选择了5000范围内的端口。

如何在服务流程中找到代码中已选择的实际端口?

一些代码显示我尝试过的内容:

Type serviceType = ...;
Uri address = new Uri("net.tcp://0.0.0.0:0/Service/");
ServiceHost serviceHost = new ServiceHost(serviceType, address);
ServiceEndpoint endPoint = serviceHost.AddServiceEndpoint(type, binding, "");
int port1 = endPoint.ListenUri.Port; // returns 0
int port2 = serviceHost.BaseAddresses.First().Port; // also returns 0

不确定这是否会有所帮助,但是SO上已经存在类似的问题: 我如何获得WCF服务的侦听地址/端口?

您可能想要尝试的已提交答案的相关部分:

foreach (var channelDispatcher in serviceHost.ChannelDispatchers)
{
            Console.WriteLine(channelDispatcher.Listener.Uri);
}

所以也许你需要channelDispatcher.Listener.Uri.Port

希望这可以帮助!

一旦服务启动,您就可以获得从Description.Endpoints集合实际创建的端点的完整描述(这在调用Open()之后才起作用)。 从这个集合中,您可以获得地址。 不幸的是,你必须对字符串解析端口的地址。

这是我的服务器在每个服务Open()之后记录的内容。

        serviceHost.Open();

        // Iterate through the endpoints contained in the ServiceDescription 
        System.Text.StringBuilder sb = new System.Text.StringBuilder(string.Format("Active Service Endpoints:{0}", Environment.NewLine), 128);
        foreach (ServiceEndpoint se in serviceHost.Description.Endpoints)
        {
            sb.Append(String.Format("Endpoint:{0}", Environment.NewLine));
            sb.Append(String.Format("\tAddress: {0}{1}", se.Address, Environment.NewLine));
            sb.Append(String.Format("\tBinding: {0}{1}", se.Binding, Environment.NewLine));
            sb.Append(String.Format("\tContract: {0}{1}", se.Contract.Name, Environment.NewLine));
            foreach (IEndpointBehavior behavior in se.Behaviors)
            {
                sb.Append(String.Format("Behavior: {0}{1}", behavior, Environment.NewLine));
            }
        }

        Console.WriteLine(sb.ToString());

作为替代方案,您可以找到WCF自己使用的免费端口:

private int FindPort()
{
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);

    using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
    {
         socket.Bind(endPoint);
         IPEndPoint local = (IPEndPoint)socket.LocalEndPoint;
         return local.Port;
    }
}

代码来自这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM