#wcf #wcf-sessions
#wcf #wcf-сеансы
Вопрос:
Я нахожусь в процессе написания дуплексной службы WCF с использованием NetTcpBinding, и я столкнулся с вопросом архитектуры, на который, как мне кажется, я знаю ответ, но надеюсь, что я ошибаюсь.
Наш сервис отслеживает состояние, и мы выбрали привязку NetTcpBinding с PerSession
InstanceContextMode
помощью . По разным причинам это то, что нам требуется. Я пытаюсь разбить наш более крупный интерфейс (где большие блоки операций не будут применяться ко многим клиентам) на несколько меньших интерфейсов с логически сгруппированными операциями. Хотя достаточно просто иметь единую реализацию сервиса, реализующую все контракты, я не уверен, возможно ли, чтобы несколько сервисных контрактов совместно использовали один канал (или, что более соответствует моему требованию, один сеанс), и мне определенно нужно было бы иметь возможность сделать это, чтобычтобы заставить это работать.
Я мог бы, конечно, включить все в один контракт и выбросить FaultException
s при выполнении недопустимой операции, но мне бы очень хотелось иметь возможность разбить их и даже не добавлять конечную точку для неприменимых контрактов. Возможно ли то, что я ищу?
Версия TL; DR:
Мне нужно уметь это делать:
[ServiceContract]
public interface IServiceA
{
[OperationContract]
void Foo();
}
[ServiceContract]
public interface IServiceB
{
[OperationContract]
void Bar();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class Service : IServiceA, IServiceB
{
...
}
И иметь возможность устанавливать один сеанс от клиента к службе, но использовать оба IServiceA
и IServiceB
.
Ответ №1:
Поставщик экземпляра по умолчанию по сеансовому каналу предоставит вам экземпляр для каждого соединения в вашем случае. Однако вы можете расширить поставщика экземпляра, чтобы получить существующий объект из вашего собственного кэша и вернуть тот же объект.
То, как вы сопоставляете экземпляры, будет зависеть от вас, Используя какой-либо специальный заголовок сообщения и т. Д. Базовый канал / соединение будут разными для каждого прокси-сервера, а также использовать разные модели буферов / параллелизма, но вы можете разрешить service model использовать один и тот же экземпляр. http://msdn.microsoft.com/en-us/magazine/cc163590.aspx
Комментарии:
1. Интересно… это определенно хорошая находка, даже если она не совсем соответствует тому, что я хочу, а именно для совместного использования соединения (я не хочу открывать один порт в брандмауэре для каждого сервисного контракта). Есть ли какой-либо способ добиться этого?
2. У вас может быть общий базовый корневой адрес, такой как net.tcp://test.com:8000/Myservice, и иметь относительные адреса под ним для каждого конечного пользователя, например net.tcp://test.com:8000/Myservice/Contract1 net.tcp://test.com:8000/Myservice/Contract2 и т. Д. Таким образом, у вас есть только один порт, но демультиплексирующее устройство подключения делегирует соответствующий контракт. Однако вы не можете использовать одно и то же соединение для разных экземпляров прокси.
3. Я согласен с разными подключениями, пока используется только один порт. Это здорово; спасибо!