简体   繁体   中英

WCF wsHttpBinding and BasicHttpBinding in same WCF Service Application

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 ?

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, eg 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

In WCF you have a base address and an enpoint address, in your case you can do something like this:

<service name="WcfEndpoints.Service1" behaviorConfiguration="WcfEndpoints.Service1Behavior">
  <!-- Service Endpoints -->
  <endpoint address="new" binding="wsHttpBinding" contract="WcfEndpoints.IService1" />
  <endpoint address="old" binding="basicHttpBinding" contract="WcfEndpoints.IService1" />
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

Note you will need additional work for the basicHttpBinding endpoint to work with older (asmx) clients

http://msdn.microsoft.com/en-us/library/ms751433.aspx

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM