exposing net.tcp endpoint

c#, wcf

Solution

Two things:

(1) once you've defined the service behavior, you of course must also apply it to the service!

<service name="MessageReaderService.MessageReaderService"
         behaviorConfiguration="ServiceBehavior">

(2) you don't need an HTTP endpoint - you don't need to have an HTTP URL - just define this service behavior like this:

<behavior name="ServiceBehavior">
    <serviceMetadata />
</behavior> 

Your metadata is now available over a `mexTcpBinding` endpoint - you cannot browse to it using HTTP, but a client can definitely connect to it and use it!

You can verify this by using the WCF Test Client and going to either

net.tcp://localhost:8082        (the base address)

or

net.tcp://localhost:8082/mex    (the mex address)

in both cases, the WCF Test Client should now find your service and be able to discover its capabilities.

Problem

I'm a bit confused of how to expose an endpoint in WCF I've got a tcp endpoint and a mex tcp endpoint. ``` <service name="MessageReaderService.MessageReaderService"> <endpoint name="NetTcpReaderService" address="ReaderService" binding="netTcpBinding" bindingConfiguration="" contract="Contracts.IMessageReaderService" /> <endpoint name="netTcpMex" address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:8082" /> </baseAddresses> </host> </service> ``` When I try to run this in the service host I get the following exception : The contract name 'IMetadataExchange' could not be found in the list of contracts implemented by the service MessageReaderService. Add a ServiceMetadataBehavior to the configuration file or to the ServiceHost directly to enable support for this contract. So I conclude from this error that I need to add a service behavior to expose metadata. So I added the behavior : ``` <behavior name="ServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> </behavior> ``` but then I get a different error : The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the HttpGetUrl property is a relative address, but there is no http base address. Either supply an http base address or set HttpGetUrl to an absolute address. - So now I have to actually add another endpoint (http) to expose the metadata over mexhttpbinding ? - is there a simple way to expose the endpoint over tcp ?

Original source