Демаркация состоит в том, чтобы аннотировать сервисные операции некоторым специальным атрибутом, чтобы определить первую и последнюю операцию в их порядке выполнения. Рассмотрим сервис, имеющий 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 вещи:
- Сессионное связывание
- Сервисный контракт SessionMode
- Поведение службы InstanceContextMode
Демаркация определяет первую и последнюю операцию в порядке выполнения.