Конечные точки WCF, baseAddressPrefixFilters, заголовки хоста

StackOverflow https://stackoverflow.com/questions/1401468

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

После большого разочарования мне удалось определить, что в обоих файлах 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Что популярно:постоянный объект.Клиентский прокси-объект (создаваемый при добавлении ссылки на службу) поддерживает постоянное соединение со службой на сервере.Экземпляр службы, на который ссылается прокси-сервер клиента, сохраняет свое состояние между вызовами, что может упростить сигнатуры методов и делает объект прокси-сервера клиента и службу в целом гораздо более полезными для определенных приложений.Типы объектов параметров могут использоваться клиентом и сервером совместно, если они объявлены в общей библиотеке. Это означает, что вам не нужно создавать два очень похожих класса или класса-оболочки для передачи не примитивных структур данных туда и обратно.

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top