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