How can I find a TCP port that is free with NetTcpBinding (WCF) (so a server can bind to it)
.net, nettcpbinding, tcp, unit-testing, wcf
Solution
You don't need to roll your own port-finding logic - Windows will choose a free port if you specify it as 0. Then you can find out which port was assigned by interrogating the dispatchers, like so:
// Specify port 0, this will cause Windows to choose a free port
var baseUri = new Uri("net.tcp://" + Dns.GetHostEntry("").HostName + ":0");
host = new WebServiceHost(typeof(MyService));
var endPoint = host.AddServiceEndpoint(typeof(IMyService), new NetTcpBinding(), baseUri);
// Tell WCF to actually bind to a free port instead of 0
endPoint.ListenUriMode = ListenUriMode.Unique;
host.Open();
// Now that the host has bound to a specific port, we can find out which one it chose
return host.ChannelDispatchers.First().Listener.Uri;
Problem
Find the next TCP port in .Net says how to do this in raw .net, but not how to safely to this with WCF. In my unit tests, I need to use the NetTcpBinding, I do not wish to hard code the port it is using. Therefore how can I get the NetTcpBinding to automatically choose a free port when used in my ServiceHost? How can I get it to tell me the port (or full endpoint address) it has chosen? Or how can I using .NET find a few port that is valid for a server to bind to? Given that my bounty did not lead to any new answers, I think we can assume there is no good answer.