Поделиться через


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

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

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

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

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

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

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

Протокол WS-AtomicTransaction

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

Протокол OleTransactions

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

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

TransactionFlow привязка Свойство привязки TransactionFlow Протокол привязки TransactionFlowProtocol Тип потока транзакций

Mandatory

true

WS-AT

Транзакция должна передаваться в обеспечивающем возможность взаимодействия формате WS-AT.

Mandatory

true

OleTransactions

Транзакция должна передаваться в формате WCF OleTransactions.

Mandatory

false

Неприменим

Неприменима, так как это недопустимая конфигурация.

Allowed

true

WS-AT

Транзакция может передаваться в обеспечивающем возможность взаимодействия формате WS-AT.

Allowed

true

OleTransactions

Транзакция может передаваться в формате WCF OleTransactions.

Allowed

false

Любое значение

Транзакция не передается.

NotAllowed

Любое значение

Любое значение

Транзакция не передается.

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

Входящее сообщение Параметры TransactionFlow Заголовок транзакции Результат обработки сообщения

Транзакция соответствует ожидаемому формату протокола

Allowed или Mandatory

MustUnderstand равняется true.

Процесс

Транзакция не соответствует ожидаемому формату протокола

Mandatory

MustUnderstand равняется false.

Отклонена, так как требуется транзакция

Транзакция не соответствует ожидаемому формату протокола

Allowed

MustUnderstand равняется false.

Отклонена, так как заголовок не распознан

Транзакция, использующая любой формат протокола

NotAllowed

MustUnderstand равняется false.

Отклонена, так как заголовок не распознан

Транзакция отсутствует

Mandatory

Неприменимо

Отклонена, так как требуется транзакция

Транзакция отсутствует

Allowed

Неприменимо

Процесс

Транзакция отсутствует

NotAllowed

Неприменимо

Процесс

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

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

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

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

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

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

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

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

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

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

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

При создании клиентов 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 Metadata Utility Tool (Svcutil.exe). Документы политики, имеющие утверждения о транзакции в выходных сообщениях или односторонних входных сообщениях, также считаются недействительными.