У меня есть один класс, который реализует набор операций, которые я хочу иметь возможность представлять как две разные службы WCF. Обратите внимание, что мне нужно, чтобы это были две разные службы, а не две разные конечные точки в одной и той же службе. Причина этого в том, что у меня есть поведение на одной из служб, требующее аутентификации имени пользователя. Такое же поведение нельзя применить к другому сервису. Существует два отдельных контракта, оба из которых были реализованы классом, который будет выполнять функции обеих служб.
Проблема, с которой я столкнулся, заключается в том, что при размещении служб в IIS имя службы должно соответствовать типу. Дубликаты имен не допускаются на двух разных сервисах. И поэтому у меня не может быть двух служб, реализованных одним и тем же классом (AFAIK).
Обходной путь, который я сейчас использую, заключается в том, что у меня есть два пустых класса-обертки, которые просто наследуются от общего класса, который реализует реальную функциональность, и ничего не добавляют в базовый класс. Это позволяет мне создать конфигурацию для двух сервисов с разными именами типов, даже если типы делают только псевдоним базового класса.
Вот пример из моего файла конфигурации (с обходным решением), чтобы помочь объяснить ...
<service behaviorConfiguration="ServicesBehavior"
name="Company.Services.ApplicationServiceWrapper">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="basicHttpBinding"
contract="Company.Contracts.IApplicationService" />
</service>
<service behaviorConfiguration="SecuredServiceBehavior"
name="Company.Services.SecuredApplicationServiceWrapper">
<endpoint address="secure"
binding="wsHttpBinding"
bindingConfiguration="secureAuthorizedBinding"
contract="Company.Contracts.ISecuredApplicationService" />
</service>
И основные реализации контрактов и оболочек ...
/// <summary>
/// These two classes are in place only so that WCF can differentiate between
/// two types, apply a different contract to each and host them in IIS.
/// </summary>
public class ApplicationServiceWrapper : ApplicationService { }
public class SecuredApplicationServiceWrapper : ApplicationService { }
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall
, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class ApplicationService : IApplicationService
, ISecuredApplicationService
{
// Implementation.
}
Есть идеи?