Конечные точки WCF, baseAddressPrefixFilters, заголовки хоста - PullRequest
0 голосов
/ 09 сентября 2009

У меня есть два сайта на одной машине. Первый (клиент) ссылается на службу WCF на втором сайте (сервер).

Как установить адрес для ссылки на услугу? При переходе от разработки на моем локальном компьютере к серверу разработки групп, как мне изменить URL-адрес службы? Сайты различаются по заголовкам хостов, например http://dev.admin/... а также http://dev.public/...

Я чувствую, что это можно сделать, используя несколько конечных точек, но я очень плохо знаком с WCF и действительно не имею понятия, что я здесь делаю.

Ответы [ 2 ]

1 голос
/ 16 сентября 2009

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

Клиент:

   <client>
      <endpoint 
        address="http://mysite.com:port/services/someservice.svc"
        binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpBinding_ISomeService"
        contract="MyServices.ISomeService" 
        name="BasicHttpBinding_ISomeService" />

    </client>
  </system.serviceModel>

Сервер

 <system.serviceModel>
    <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
        <add prefix="http://mysite.com:port/services"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServices.SomeServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="MyServices.SomeServiceBehavior"
        name="MyServices.SomeService">
          <endpoint address="http://mysite.com:port/services/someservice.svc" 
                    name="endpoint.SomeService"
                    binding="basicHttpBinding" 
                    bindingConfiguration="" 
                    contract="MyServices.ISomeService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

Здесь следует отметить, что адрес хоста во всех трех соответствующих разделах (адрес конечной точки клиента, значение baseAddressPrefixFilter сервера и адрес конечной точки сервера) должен совпадать.

Я могу переключаться между серверами, изменяя их, если они совпадают. Я бы все же предпочел способ установить это в зависимости от того, на какой машине работает сервер, но на данный момент это работает.

Показы WCF Что горячо: постоянный объект. Прокси-объект клиента (созданный при добавлении ссылки на службу) поддерживает постоянное подключение к службе на сервере. Экземпляр службы, на который ссылается прокси-клиент, поддерживает свое состояние между вызовами, что может упростить сигнатуры методов и делает объект прокси-клиента и сервис в целом гораздо более полезным для определенных приложений. Типы объектов параметров могут совместно использоваться клиентом и сервером, если они объявлены в общей библиотеке. Это означает, что вам не нужно создавать два очень похожих класса или класса-оболочки для передачи не примитивных структур данных туда и обратно.

Что не так: конфигурация - королевская боль, плохо документирована и слишком сложна. Заставить его работать в конфигурации тестовой / dev / staging / production среды, где службе необходимо знать о ее местонахождении, сложно. Я не уверен, что информирование службы о URL своего домена (а не, скажем, об относительном пути к тому, на чем она выполняется) имеет какое-то существенное преимущество, за исключением проблем безопасности.

Тем не менее, я продолжаю идти по пути WCF, так как его преимущества намного превосходят головные боли.

0 голосов
/ 09 сентября 2009

Самый простой способ: запустить части WCF на разных портах.

...