WCF: Что именно делает IsInitiating? - PullRequest
3 голосов
/ 25 марта 2009

В некоторых местах я вижу, что IsInitiating создает новый сеанс. В других местах говорят, что он создает новую сессию только при необходимости. Что правильно?

Просто чтобы прояснить ситуацию, я хочу убедиться, что могу вызывать IService.Foo три раза без создания трех сеансов.

Ответы [ 2 ]

4 голосов
/ 25 марта 2009

При первом вызове операции IsInitiating = true через канал начинается сеанс. Будущие вызовы операций IsInitiating = true не запускают новые сеансы, они просто становятся частью существующего сеанса. Сеанс заканчивается после вызова операции IsTerminating (это приводит к тому, что клиент закрывает канал). Никакие дальнейшие операции не могут быть вызваны через канал после возврата операции IsTerminating. Эти свойства дают разработчикам контроль над порядком вызова операций относительно времени жизни сеанса.

Извините, вот ссылка на источник.

0 голосов
/ 22 июля 2018

Демаркация состоит в том, чтобы аннотировать сервисные операции некоторым специальным атрибутом, чтобы определить первую и последнюю операцию в их порядке выполнения. Рассмотрим сервис, имеющий 4 метода / операции с именами SignIn (), GetDetails (). TransferFund () и SignOut (). В таком случае пользователь должен войти в систему, а затем попытаться получить данные и выполнить передачу. Если пользователь выходит из системы, ему нельзя разрешать дальнейшие запросы, пока он не войдет в систему. Чтобы настроить такой тип порядка выполнения, требуется разграничение. Есть два атрибута:

IsInitiating (Default - True) 
IsTerminating (Default – False)

Эти атрибуты определяют, какая операция должна быть вызвана первой, а какая должна быть последней? Для вышеуказанных четырех операций может быть одна из следующих последовательностей:

[OperationContract(IsInitiating = True)]
 Bool SignIn()

[OperationContract(IsInitiating = false)]
 String GetDetails()

[OperationContract(IsInitiating = false)]
 Bool TransferFund()

[OperationContract(IsInitiating = false, IsTerminating = True)]
 Bool SignOut()

Здесь инициирование и завершение относится к сеансу, который является обязательным для разграничения, поскольку службе необходимо знать, соблюдает ли клиент конкретную последовательность или нет. Здесь операции 2,3 и 4 установлены на IsInitiating = false, поэтому не могут быть вызваны первыми, но могут быть вызваны после вызова операции Isinitiating = True. Аналогично, операция 4 аннотируется как IsTerminating = True, поэтому, когда она вызывается, она завершает сеанс (вместе с базовым каналом), и тогда клиент не может делать дополнительные вызовы, пока не будет создан новый прокси и не будет вызвана операция IsInitiating = True. Чтобы использовать демаркацию, необходима следующая конфигурация:

Сеанс поддержки связывания Для SessionMode установлено значение Required Когда вызывается операция IsTerminating, WCF отбрасывает канал и никогда не принимает от него дальнейшие сообщения. Если операция не оформлена явно ни одним из этих атрибутов, то к ней будет применимо значение по умолчанию этих атрибутов.

Пока это все.

Наконец, просто повторим один раз - для сессии WCF нужно помнить 3 вещи:

  1. Сессионное связывание
  2. Сервисный контракт SessionMode
  3. Поведение службы InstanceContextMode

Демаркация определяет первую и последнюю операцию в порядке выполнения.

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