WCF wsHttpBinding and BasicHttpBinding in same WCF Service Application

wcf

I have been told that wsHttpBinding does not support older clients that still need to use older version of SOAP. I want to add a BasicHttpBinding endpoint in the same WCF Service Application so that clients can use either endpoint depending on their technology they are running. I am confused as to what the address to use for each of them. The default wsHttpBinding has no address set. What should the address be for BasicHttpBinding endpoint? Shouldn't the address for the wsHttpBinding be (for my example) http://localhost/WcfService1/Service1.svc ?

Best Answer

There's two things you need to consider here:

  • if your hosting in IIS (or WAS as part of IIS7), you cannot set a base address - the base address for your service will be the virtual directory where the MyService.svc file lives. You can still set relative addresses, though

  • if you self-host, you typically will add base addresses in your config, so you can spare yourself having to spell out the entire address all the time (but you can - if you wish to do so).

So if you have your MyService.svc inside a virtual directory called MyApp on your localhost machine, and then use this config:

<service name="MyService" behaviorConfiguration="Default">
    <endpoint 
        address="wsHttp"  
        binding="wsHttpBinding" 
        contract="IMyService" />
  <endpoint 
        address="basic" 
        binding="basicHttpBinding" 
        contract="IMyService" />
</service>

then your "old-style" basicHttp service will be reachable at:

http://localhost/MyApp/MyService.svc/basic

and your new wsHttp driven service will be reachable at:

http://localhost/MyApp/MyService.svc/wsHttp

You can name those relative addresses (anything after .../MyApp/MyService.svc) anything you like - just make sure they're different from one another.

Hosting in IIS --> location (virtual directory) of your *.svc file becomes your base address.

If you self-host your service inside a console app or a Windows NT Service, you get to set your base addresses yourself:

<services>
  <service name="MyService" behaviorConfiguration="Default">
    <host>
      <baseAddresses>
         <add baseAddress="http://localhost:8185/Services/" />
      </baseAddresses>
    </host>
  </service>
</services>

Now in this case, your "old-style" basicHttp service will be reachable at:

http://localhost:8185/Services/basic

and your new wsHttp driven service will be reachable at:

http://localhost:8185/Services/wsHttp

You can define a base address for each of the transports, e.g. one for http://, one for net.tcp:// and so on.

And of course, if you really must, you can also define your complete addresses inside your <endpoint> element for each of the service endpoints - this gives you total flexibility (but only works in self-hosting scenarios).

Marc

Related Topic