tags:

views:

42

answers:

3

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?

A: 

You can use OperationContext.Channel.LocalAddress.Uri.Port to know the port used in the call to a service

CriGoT
Is there a way to do it outside the service itself (in the console host code)? I don't have an OperationContext there.
mafutrct
A: 

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

Turek
I'm in .net 3.5, WCF Discovery is not available sadly.
mafutrct
A: 

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)

mafutrct
Since I got no new responses I'll accept this solution even though I don't like it.
mafutrct