I'm using multiple self-hosted WCF services on the same machine. I need to open each of them on a different port (obviously), so I used "net:tcp://localhost:0" as address since I figured it would assign a free port this way.
Now I need to know which port was assigned actually. This code runs on the server, so I need the local port. How do I do that?
You can use OperationContext.Channel.LocalAddress.Uri.Port
to know the port used in the call to a service
Then you need another place to store all service's ports to read them from outside the server. If it's another service, then it needs a constant port. It also can be a xml file over http or something modified on each of service's startup.
More on WCF Discovery
Found something that works, even though it is a bit dirty. Instead of automatically assigning a port, a free port is explicitly requested and used to create the service:
Address = "net.tcp://localhost:" + FindFreeTcpPort ();
private static int FindFreeTcpPort ()
{
TcpListener l = new TcpListener (IPAddress.Parse ("127.0.0.1"), 0);
l.Start ();
int port = ((IPEndPoint) l.LocalEndpoint).Port;
l.Stop ();
return port;
}
(the method code is from here)