Включение потока транзакций

Windows Communication Foundation (WCF) предоставляет высоко гибкие возможности управления потоком транзакций. Параметры потока транзакций службы могут быть выражены посредством комбинации атрибутов и конфигурации.

Параметры потока транзакций

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

  • атрибута TransactionFlowAttribute, определенного для каждого метода в контракте службы;

  • свойства привязки TransactionFlow в конкретной привязке.

  • свойства привязки TransactionFlowProtocol в конкретной привязке. Свойство привязки TransactionFlowProtocol позволяет выбрать один из двух различных протоколов транзакций для передачи транзакции. Эти протоколы кратко описываются в следующих разделах.

Протокол WS-AtomicTransaction

В сценариях, требующих взаимодействия со сторонним стеком протоколов, удобно использовать протокол WS-AtomicTransaction (WS-AT).

Протокол OleTransactions

В сценариях, не требующих взаимодействия со сторонним стеком протоколов, когда специалисту, выполняющему развертывание приложения, известно, что служба протокола WS-AT отключена в данном местоположении или в топологии существующей сети предпочтительно не использовать протокол WS-AT, удобно использовать протокол OleTransactions.

В следующей таблице показаны типы потоков транзакций, которые можно создать, используя представленные различные комбинации.

TransactionFlow

binding
Свойство привязки TransactionFlow Протокол привязки TransactionFlowProtocol Тип потока транзакций
Обязательно true WS-AT Транзакция должна передаваться в обеспечивающем возможность взаимодействия формате WS-AT.
Обязательно true OleTransactions Транзакция должна передаваться в формате WCF OleTransactions.
Обязательно false Нет данных Неприменима, так как это недопустимая конфигурация.
Допустимо true WS-AT Транзакция может передаваться в обеспечивающем возможность взаимодействия формате WS-AT.
Допустимо true OleTransactions Транзакция может передаваться в формате WCF OleTransactions.
Допустимо false Любое значение Транзакция не передается.
NotAllowed Любое значение Любое значение Транзакция не передается.

В следующей таблице приведены сводные результаты обработки сообщений.

Входящее сообщение Параметры TransactionFlow Заголовок транзакции Результат обработки сообщения
Транзакция соответствует ожидаемому формату протокола Allowed или Mandatory MustUnderstand равно true. Обработка
Транзакция не соответствует ожидаемому формату протокола Обязательно MustUnderstand равно false. Отклонена, так как требуется транзакция
Транзакция не соответствует ожидаемому формату протокола Допустимо MustUnderstand равно false. Отклонена, так как заголовок не распознан
Транзакция, использующая любой формат протокола NotAllowed MustUnderstand равно false. Отклонена, так как заголовок не распознан
Транзакция отсутствует Обязательно Н/П Отклонена, так как требуется транзакция
Транзакция отсутствует Допустимо Н/П Обработка
Транзакция отсутствует NotAllowed Н/П Обработка

Хотя у каждого метода в контракте могут быть разные требования к потоку транзакций, параметр протокола передачи транзакций действует на уровне привязки. Это означает, что во всех методах, использующих совместно одну и ту же конечную точку (и, таким образом, одну и ту же привязку), применяется одна и та же политика, в соответствии с которой разрешена или необходима передача транзакций, так же как и тот же протокол транзакций, если применимо.

Включение потока транзакций на уровне метода

Требования потока транзакций не всегда одинаковы для всех методов в контракте службы. Поэтому WCF также предоставляет механизм на основе атрибутов, позволяющий выразить предпочтения потока транзакций каждого метода. Это обеспечивается посредством атрибута TransactionFlowAttribute, задающего уровень, на котором операция службы принимает заголовок транзакции. Для включения потока транзакций необходимо пометить методы контракта службы этим атрибутом. Этот атрибут принимает одно из значений перечисления TransactionFlowOption, в котором значением по умолчанию является NotAllowed. Если задано какое-либо значение, отличное от NotAllowed, требуется, чтобы метод был не односторонним. Разработчик может использовать этот атрибут для задания требований или ограничений потока транзакций на уровне метода во время разработки.

Включение потока транзакций на уровне конечной точки

Помимо параметра потока транзакций уровня метода, TransactionFlowAttribute который предоставляет атрибут, WCF предоставляет параметр на уровне конечной точки для потока транзакций, чтобы администраторы могли управлять потоком транзакций на более высоком уровне.

Это обеспечивается элементом TransactionFlowBindingElement, который позволяет включить или отключить входящий поток транзакций в параметрах привязки конечной точки, а также задать необходимый формат протокола транзакций для входящих транзакций.

Если поток транзакций привязки выключен, но для выполнения одной из операций в контракте службы требуется входящая транзакция, при запуске службы вызывается исключение проверки.

Большая часть постоянных привязок WCF содержит transactionFlow и transactionProtocol атрибуты, позволяющие настроить конкретную привязку для принятия входящих транзакций. Дополнительные сведения о настройке элементов конфигурации см. в разделе привязки>.<

Администратор или разработчик могут использовать поток транзакций уровня конечной точки для настройки на этапе разработки требований или ограничений для потока транзакций с помощью файла конфигурации.

Безопасность

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

При создании клиентов WCF для неизвестных или ненадежных веб-служб с помощью обмена метаданными вызовы операций с этими веб-службами должны по возможности отключить текущую транзакцию. В следующем примере показано, как это сделать.

//client code which has an ambient transaction  
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))  
{  
    // No transaction will flow to this operation  
    untrustedProxy.Operation1(...);  
    scope.Complete();  
}  
//remainder of client code  

Кроме того, службы должны быть настроены таким образом, что они принимают входящие транзакции только от прошедших проверку подлинности и авторизованных клиентов. Входящие транзакции должны приниматься только от клиентов высокого уровня доверия.

Утверждения политики

WCF использует утверждения политики для управления потоком транзакций. Утверждения политики описаны в документе о политике службы, агрегируемом с помощью добавления контрактов, конфигурации и атрибутов. Клиент может получить документ о политике службы с помощью запроса-ответа HTTP GET или WS-MetadataExchange. Клиенты затем могут обработать документ о политике, определив, для каких операций в контракте службы может поддерживаться или требуется поток транзакций.

Утверждения политики потока транзакций влияют на поток транзакций, указывая заголовки протокола SOAP, которые должны посылаться клиентом службе для представления транзакции. Все заголовки транзакций должны быть помечены MustUnderstand равняется true. Любое сообщение с заголовком, помеченным иначе, отклоняется с ошибкой SOAP.

В одной операции может присутствовать только одно утверждение политики транзакций. Документы политики с несколькими утверждениями транзакций для операции считаются недопустимыми и отклоняются WCF. Кроме того, в каждом типе порта может присутствовать только один протокол транзакций. Документы политики с операциями, ссылающимися на несколько протоколов транзакций внутри одного типа порта, считаются недопустимыми и отклоняются средством служебной программы метаданных ServiceModel (Svcutil.exe). Документы политики, имеющие утверждения о транзакции в выходных сообщениях или односторонних входных сообщениях, также считаются недействительными.