如何获取WCF服务正在侦听的端口?
我有一个net.tcp WCF服务,我希望操作系统选择它应该监听的端口。所以我在我的URI中将端口设置为0,并且netstat
确认操作系统选择了5000范围内的端口。如何获取WCF服务正在侦听的端口?
如何在服务流程中找到在代码中选取的实际端口?
一些代码来说明我曾尝试:
如果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: How can I get the listening address/port of a WCF service?
一个提交的答案的有关部分规定你可能想尝试:
foreach (var channelDispatcher in serviceHost.ChannelDispatchers)
{
Console.WriteLine(channelDispatcher.Listener.Uri);
}
所以,也许你需要channelDispatcher.Listener.Uri.Port
。
希望这会有所帮助!
作为替代方案,你可以找到一个免费的端口WCF使用自己:从here
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;
}
}
代码。
这不安全。其他人可以在处理套接字后但在ServiceHost打开之前抢夺端口。所以这种方法可能偶尔会失败。 – BatteryBackupUnit 2014-07-21 12:09:31
服务启动后,您可以完全描述实际上从Description.Endpoints集合创建的端点(直到调用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());
+1让我走上正轨 – ngoozeff 2010-08-27 06:16:34
得到一个服务在一个随机端口上收听是非常不寻常的 - 是否有你想要这样做的原因? – Cocowalla 2010-08-25 06:45:45
@Cocowalla:该服务是工作进程的一部分,因此可能有多个服务进程,并且我们正在研究不涉及.NET TCP端口共享的解决方案。 – ngoozeff 2010-08-25 06:51:20
[我如何获得WCF服务的监听地址/端口?](http://stackoverflow.com/questions/2207348/how-can-i-get-the-listening-address-port-of -a-wcf-service) – mafu 2012-04-18 11:08:20