wcf endpoint relative address

pushist1y picture pushist1y · Oct 31, 2011 · Viewed 19.7k times · Source

I'm just learning wcf and can't understand one very basic thing.

I'm creating a WCF service which I want to be hosted in IIS just like web application with it's own path like http://myhost/myapp/ and everything.

I'm creating the WCF service project in VS, I've got an *.svc file describing it, then I define a simple endpoint to it like that:

<endpoint address="" 
          binding="basicHttpBinding" 
          contract="wcf_service_auth.IPshService" />

Then I publish this service like an IIS web application to a virtual directory, let's assume it's name psh_pub, so I can access the service via url http://localhost/psh_pub/pshservice.svc/. It shows me WCF greetings page and gives me a link to WSDL, which gives me correct wsdl description.

That's ok.

The next step - I want to add a MEX endpoint. I add to config:

<endpoint address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>

That's ok too, the endpoint is accessible at address http://localhost/psh_pub/pshservice.svc/mex and WcfTestClient.exe gives me correct config from that url.

Here the problem comes.

I have a WCF service working under IIS and I want to add one more endpoint to it. For example let it be a net.tcp endpoint. The IIS is configured by default to accept net.tcp connections at port 808 and I'm adding net.tcp protocol to properties of my web app, and I want to add an endpoint to my service like that:

<endpoint address=""
          binding="netTcpBinding" 
          contract="wcf_service_auth.IPshService"  />

and now I assume that my service should be accessible via the url net.tcp://localhost:808/psh_pub/pshservice.svc. But it's not. And every "how-to" and manual on the web tells that I should specify full address in the config file like that:

<endpoint address="net.tcp://localhost:808/psh_pub/pshservice.svc" 
          binding="netTcpBinding" 
          contract="wcf_service_auth.IPshService" />

And if I do so, it works. But if host the service in another virtual directory, I'll need to change the config. If I host it on the other server, I'll need to change config. If I host it on multiple servers, I'll have to maintain as many configs as servers I have.

So the main questions is:

Is there any way in WCF to specify a net.tcp (or https) endpoint of a IIS-hosted WCF service without specifying absolute url for it?

Answer

marc_s picture marc_s · Oct 31, 2011

You should be able to define a base address for your net.tcp service endpoints:

<service name="YourServiceName">
   <host>
       <baseAddresses>
          <add baseAddress="net.tcp://localhost:808/psh_pub/" />
       </baseAddresses>
   </host>

Then you should be able to use relative addresses in your actual endpoints:

   <endpoint name="Tcp01"
             address="pshservice.svc" 
             binding="netTcpBinding" 
             contract="wcf_service_auth.IPshService" />
</service>