Настройка двух служб WCF (не только конечных точек) для размещения в IIS с разными контрактами, реализованными одним и тем же классом? - PullRequest
1 голос
/ 24 февраля 2011

У меня есть один класс, который реализует набор операций, которые я хочу иметь возможность представлять как две разные службы 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.
    }

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...