Menahem Menahem - 2 months ago 66
C# Question

WCF net tcp port sharing

I have 2 WCF services each hosted in its own console app.

they are hosted at:

net.tcp://computername:7777/Service1
net.tcp://computername:7777/Service2


each has its own contract.
i want them to use the same port, so i read a lot on the subject, and did the following:


  1. Enabled the net tcp port sharing service.

  2. Registered the url`s using the commands:



netsh http add urlacl user=domain\username url=net.tcp://+:7777/Service1


netsh http add urlacl user=domain\username url=net.tcp://+:7777/Service2



  1. enabled the
    PortSharingEnabled=true
    on the bindings in for each WCF service

  2. hosted each one in it`s own console app.



if i start both console apps, the second one always gives this exception on the call to the host's
Open()
method:

AddressAlreadyInUseException. The transport manager failed to listen on the supplied
URI using the NetTcpPortSharing service: the URI is already registered with the
service.


when i host them both in the same console app, it all works just fine.

my question is: how to get it working when each service is hosted in it's own console app.

Answer

As Jon_Lindeheim and you stated, this should work fine. so i recreated everything from scratch as follows:

I have two WCF services that had the same base address and a different relative URI
i.e. for service 1:

    <add baseAddress = "net.tcp://computername:7777/" />
    ...
    <endpoint address = "/service1" ... />

and for service 2:

    <add baseAddress = "net.tcp://computername:7777/" />
    ...
    <endpoint address = "/service2" ... />  

I was not aware that base addresses must be different not just the eventual absolute URI.

so the following works fine: for service 1:

    <add baseAddress = "net.tcp://computername:7777/service1/" />
    ...
    <endpoint address = "/service1" ... />

for service 2:

    <add baseAddress = "net.tcp://computername:7777/service2/" />
    ...
    <endpoint address = "/service2" ... />  

(why the first erroneous way still works when all is in one process, i think it's related to the way port sharing routes the traffic on a process based way).

Thanks again

Comments