Andrew
Andrew

Reputation: 59

WCF TCP Shared Services Enable Service Fails to Start

In short, when I go to start the worker process service process, it fails and returns:

The CS.Connector.Protean service on Local Computer started and then stopped. Some services stop automatically if they are not in use by other services or programs

I remove the attribute portSharingEnabled="true" from the service model in the config file and then the worker process service starts and executes as expected. I then add the attribute back into the config and the worker process services won't start again. I have include the service model config at the bottom of this post.

The Net.TCP Sharing Service is running, so it should be intercepting the incoming net.TCP connection.

I have read this MSDN article, but I must be missing something somewhere.

Could it be do doe with the mex end point not using a port sharing binding? I tried adding a binding to the mex end point, but still no joy. :.(

Help! Thanks

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="TCPSecure" portSharingEnabled="true">
          <security mode="Message" />
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service name="Protean.Connector.ProteanConnector">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="TCPSecure" contract="Protean.Connector.IProteanConnector"></endpoint>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://10.1.2.124:60000/ProteanConnector" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Update!

  1. I started off with a working service and confirmed this by a test.
  2. I added the attribute port sharing and the service failed to start.
  3. I removed the mex end point and the service ran successfully. An application that had a established connection was able to use the service successfully.
  4. I added the mex back in with a reference to a binding that only had port sharing enabled and the service fail to start.

I need the mex to make the service discoverable to the IDE Visual Studios.

I suppose that the question now is, how does the end point, for the metadata exchange, work along with the port sharing attribute?

Update 2

MSDN Social Webpage Link

This forum tells me to change the mex binding from mexTcpBinding to netTcpBinging. I did and the service ran, but I am unable to discover the service now in the IDE.

Is this the correct solution path? The journey continues.

I'm starting to think the deeper I dig the more likely it will be that I stumble upon some government conspiracy. #HumourInDarkTimes #StrangerThings ;)

Upvotes: 0

Views: 172

Answers (1)

Andrew
Andrew

Reputation: 59

Solution

    var type = typeof(LoggingManager);

    using (var host = new ServiceHost(type))
    {

        /*
         * Work-around to the conflict between global port sharing and local port sharing 
         * caused by Net.Tcp Sharing Serivces and the default port exclusivity (hogging) of Metadata Exchange binding.
         */
        var mexBinding = new CustomBinding(MetadataExchangeBindings.CreateMexTcpBinding());
        mexBinding.Elements.Find<TcpTransportBindingElement>().PortSharingEnabled = true;
        host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");

        host.Open();
        Console.WriteLine("Service started. Press [Enter] to exit.");
        Console.ReadLine();
        host.Close();
    }

Description of Solution

I read a number of articles that suggests a solution through swapping the binding mexTcpBinding for netTCPBinding, I found that this did not work in my instance.

The above solution gets the mexTCPBinding and adds to it the attribute PortSharingEnabled = true. This is used in creating a new endpoint code-matically and passed to the service host. Finally, I have removed the meta-exchange end point from the config and, hey-presto, it worked.

Useful Links

Upvotes: 2

Related Questions