Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

wcf endpoint relative address

Tags:

wcf

endpoint

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?

like image 268
pushist1y Avatar asked Feb 03 '23 12:02

pushist1y


2 Answers

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>
like image 155
marc_s Avatar answered Feb 08 '23 01:02

marc_s


WCF file-less activation (.Net 4.0) will let you register under a relative virtual path using the relativeAddress attribute:

<system.serviceModel>
  <serviceHostingEnvironment>
    <serviceActivations>
      <add relativeAddress="relative-virtual-path/yourservice.svc"
           service="YourServiceImpl" />
    </serviceActivations>
  </serviceHostingEnvironment>
</system.serviceModel>

relative to the base address of the Web application

This link talks about it: http://msdn.microsoft.com/en-us/library/ee354381.aspx

like image 30
Craig Avatar answered Feb 08 '23 00:02

Craig