Search code examples
wcftcpnettcpbinding

Can't add service reference to net tcp wcf service


I have a WCF service hosted on my local machine as windows service. Now I'm trying to add a service reference in the client (again on my local dev machine) but I'm getting an error

Metadata contains a reference that cannot be resolved: 'net.tcp://localhost:8523/Service1'. Could not connect to net.tcp://localhost:8523/Service1. The connection attempt lasted for a time span of 00:00:02.0011145. TCP error code 10061: No connection could be made because the target machine actively refused it

I checked that the Windows firewall doesn't block port 8523. I even created a new rule in Windows firewall to allow run 8523 port. But when I'm running netstat -sp tcp I can't seem to find port 8523. But I can see Serice1 service's state is set to START in Services. This is the config files

Service Library

<system.serviceModel>
  <services>
    <service name="WcfServiceLibrary1.Service1">
      <endpoint 
           address="" 
           binding="netTcpBinding" bindingConfiguration=""
           contract="WcfServiceLibrary1.IService1">
         <identity>
           <dns value="localhost" />
         </identity>
      </endpoint>
      <endpoint 
           address="mex" 
           binding="mexTcpBinding" bindingConfiguration=""
           contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:8523/Service1" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="">
        <serviceMetadata httpGetEnabled="false" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

Config in the windows service project looks identical.


Solution

  • Michael, this is a net.tcp binding that I typically use for a WCF service.

        <bindings>
            <netTcpBinding>
                <binding name="TcpBinding"
                         receiveTimeout="Infinite"
                         sendTimeout="Infinite"
                         maxBufferSize="2147483647"
                         maxReceivedMessageSize="2147483647">
                    <reliableSession inactivityTimeout="Infinite"/>
                    <security mode="None"/>
                </binding>
            </netTcpBinding>
        </bindings>
    

    Try to add it to your configuration:

    <service name="WcfServiceLibrary1.Service1">   
        <endpoint    
            address=""    
            binding="netTcpBinding" bindingConfiguration="TcpBinding"   
            contract="WcfServiceLibrary1.IService1">   
        ...
    

    Also, my services are running under ServiceAccount.LocalSystem.

    Check

    netstat -ap tcp

    if the service is listening.

    EDIT: my Service class below. Note that the current directory of the windows service is set programatically to the BaseDirectory, i.e. the directory of the executable.

    public class Service : ServiceBase
    {
        public static void Main()
        {
            Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
            ServiceBase.Run(new Service());
        }
    
        ...
    }