Michael
Michael

Reputation: 3071

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.

Upvotes: 2

Views: 13419

Answers (4)

DKo
DKo

Reputation: 880

Had the same issue. After a lot of troubleshooting I found out I was missing a reference to the service in Web.config in the service project, so I added this to Web.config:

<system.serviceModel>
  <services>
    <service name="serviceName" behaviorConfiguration="BasicServiceBehavior" >
      <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicServiceBasicHttpBinding" contract="(I<nameofservice>)"/>
    </service>
  </services>
</system.serviceModel>

After this a rebuilt the solution (which created the interface) and republished. Then I could finally add a service reference from my other project.

Upvotes: 0

Clemens
Clemens

Reputation: 128136

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());
    }

    ...
}

Upvotes: 4

Dejan Janjušević
Dejan Janjušević

Reputation: 3230

Check that Net.Tcp listener adapter service is running (although if it works while hosting the service in console application, it should be running).

To find the port your service is using,

  1. Open Task Manager
  2. Select View -> Select Columns -> Check PID -> OK
  3. Find your service process name, note the PID
  4. Run the followind command from the command prompt: netstat -ano | findstr *PID*

Upvotes: 0

Mendhak
Mendhak

Reputation: 8795

You've specified a behavior but haven't given it a name. Give the behavior a name and point to it using behaviorConfiguration in your service.

<service name="WcfServiceLibrary1.Service1" behaviorConfiguration="svc1behavior">

...

<serviceBehaviors>
<behavior name="svc1behavior">
  <serviceMetadata httpGetEnabled="false" />
  <serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>

Upvotes: 1

Related Questions