WCF wsHttpBinding и BasicHttpBinding в одном и том же приложении службы WCF

Мне сказали, что wsHttpBinding не поддерживает старые клиенты, которым все еще нужно использовать более старую версию SOAP. Я хочу добавить конечную точку BasicHttpBinding в том же приложении службы WCF, чтобы клиенты могли использовать любую конечную точку в зависимости от используемой технологии. Я не совсем понимаю, какой адрес использовать для каждого из них. По умолчанию wsHttpBinding не имеет установленного адреса. Каким должен быть адрес для конечной точки BasicHttpBinding? Не должен ли адрес для wsHttpBinding (для моего примера) быть http: //localhost/WcfService1/Service1.svc ?

8 wcf
24.08.2009 03:10:35
2 ОТВЕТА
РЕШЕНИЕ

Здесь нужно учесть две вещи:

  • если ваш хостинг в IIS (или WAS как часть IIS7), вы не можете установить базовый адрес - базовый адрес для вашей службы будет виртуальным каталогом, в котором находится MyService.svcфайл. Вы все еще можете установить относительные адреса, хотя

  • если вы размещаетесь самостоятельно, вы обычно добавляете базовые адреса в свою конфигурацию, так что вы можете избавиться от необходимости постоянно указывать полный адрес (но вы можете - если вы хотите это сделать).

Так что если у вас есть MyService.svcвиртуальный каталог, который вызывается MyAppна вашей localhostмашине, а затем используйте эту конфигурацию:

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

тогда ваш базовый Http-сервис в "старом стиле" будет доступен по адресу:

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

и ваш новый сервис, управляемый wsHttp, будет доступен по адресу:

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

Вы можете назвать эти относительные адреса (что угодно после .../MyApp/MyService.svc) как угодно - просто убедитесь, что они отличаются друг от друга.

Хостинг в IIS -> местоположение (виртуальный каталог) вашего * .svc файла становится вашим базовым адресом.

Если вы самостоятельно размещаете свой сервис в консольном приложении или службе Windows NT, вы можете самостоятельно настроить базовые адреса:

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

Теперь в этом случае ваша базовая служба «старого стиля» будет доступна по адресу:

http://localhost:8185/Services/basic

и ваш новый сервис, управляемый wsHttp, будет доступен по адресу:

http://localhost:8185/Services/wsHttp

Вы можете определить базовый адрес для каждого из транспортов, например, один для http: //, один для net.tcp: // и так далее.

И, конечно, если вам действительно необходимо, вы также можете определить свои полные адреса внутри <endpoint>элемента для каждой из конечных точек службы - это дает вам полную гибкость (но работает только в сценариях с самостоятельным размещением).

Марк

17
24.08.2009 04:36:55
Возможно ли, чтобы ваша конечная точка wsHttp указывала на корневой каталог, а затем адрес конечной точки basicHttp указывал на root \ basic?
EbbnFlow 19.06.2012 19:10:10

В WCF у вас есть базовый адрес и адрес enpoint, в вашем случае вы можете сделать что-то вроде этого:

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

Обратите внимание, что вам потребуется дополнительная работа для конечной точки basicHttpBinding для работы со старыми (asmx) клиентами

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

2
24.08.2009 03:39:59