У меня есть набор контрактов на обслуживание, которые разделяют мой интерфейс службы на части связанных функций. В настоящее время я реализую все контракты с использованием одного класса обслуживания (возможно, позже я захочу разделить их, но пока достаточно одного класса обслуживания).
Я пытаюсь настроить конечные точки с помощью файла конфигурации (в отличие от кода). Проблема в том, что я получаю ServiceActivationException
, потому что две конечные точки (по одной для каждого контракта службы) пытаются прослушивать один и тот же uri. Детали исключения говорят, что для достижения этого две конечные точки должны совместно использовать объект привязки, что имеет смысл, но я не могу понять, как это сделать с помощью конфигурации (я не пробовал делать это с помощью кода, поскольку я размещаю в IIS, но Я могу представить, что это простое упражнение для настройки в коде).
Ниже приводится конфигурация, которую я использую в настоящее время (это все еще разработка, поэтому я не беспокоюсь о проблемах безопасности и т. Д., Которые могут быть обнаружены некоторыми из этих настроек):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="CDC.WebPortal.MidTier.MidTierAccessService"
behaviorConfiguration="MidTierServiceBehaviour" >
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.IProductService" />
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.ICategoryService" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="RestBindingConfiguration"
maxReceivedMessageSize="104857600">
<readerQuotas maxStringContentLength="104857600"/>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MidTierServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
So my question is how do I share this binding between the two endpoints?
Комментарии в этом вопросе SO предполагают, что я, возможно, не смогу это сделать, но я не верьте, что это правильно.
ОБНОВЛЕНИЕ 1 Согласно этой публикации MS то, что я делаю, должно быть в порядке ...
ОБНОВЛЕНИЕ 2 Вот содержание файла SVC, если это помогает:
<%@ ServiceHost Language="VB" Debug="true"
Service="*********************.MidTierAccessService"
Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %>
ОБНОВЛЕНИЕ 3. Подробная информация об исключении:
Экземпляр привязки уже был связан для прослушивания URI '********************'. Если две конечные точки хотят использовать один и тот же ListenUri, они также должны совместно использовать один и тот же экземпляр объекта привязки. Две конфликтующие конечные точки были либо указаны в вызовах AddServiceEndpoint (), в файле конфигурации, либо в сочетании AddServiceEndpoint () и config.
ОБНОВЛЕНИЕ 4 Хорошо, я пропустил это ранее, заявив: «Вам нужно будет использовать относительные адреса при открытии более одной конечной точки для конкретной службы .svc». Причина этого в том, что виртуальный каталог IIS определяет базовый адрес службы. Может ли кто-нибудь объяснить это более подробно, например, почему IIS требуется относительная адресация для каждого контракта.