Конечные точки WCF, baseAddressPrefixFilters, заголовки хоста
Вопрос
У меня есть два сайта на одной машине.Первый (клиент) ссылается на службу 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 на разных портах.