WCF wsHttpBinding и BasicHttpBinding в одном приложении службы WCF - PullRequest
8 голосов
/ 24 августа 2009

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

Ответы [ 2 ]

17 голосов
/ 24 августа 2009

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

  • если ваш хостинг в 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://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> для каждой из конечных точек службы - это дает вам полную гибкость (но работает только в сценариях с автономным хостингом).

Марк

2 голосов
/ 24 августа 2009

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

<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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...