Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Windows Communication Foundation (WCF) предоставляет высоко гибкие возможности управления потоком транзакций. Параметры потока транзакций службы можно выразить с помощью сочетания атрибутов и конфигурации.
Параметры потока транзакций
Параметры потока транзакций создаются для конечной точки службы в результате пересечения следующих трех значений:
Атрибут TransactionFlowAttribute, указанный для каждого метода в контракте службы.
Свойство
TransactionFlowпривязки в конкретной привязке.Свойство
TransactionFlowProtocolпривязки в конкретной привязке. СвойствоTransactionFlowProtocolпривязки позволяет выбрать один из двух разных протоколов транзакций, которые можно использовать для потоковой транзакции. В следующих разделах кратко описано каждое из них.
Протокол WS-AtomicTransaction
Протокол WS-AtomicTransaction (WS-AT) полезен для сценариев, когда требуется взаимодействие с стеками сторонних протоколов.
Протокол OleTransactions
Протокол OleTransactions полезен для сценариев, когда взаимодействие с сторонними стеками протоколов не требуется, а развёртыватель службы заранее знает, что служба протокола WS-AT отключена локально или существующая сетевая топология не поддерживает использование WS-AT.
В следующей таблице показаны различные типы потоков транзакций, которые можно создать с помощью этих различных сочетаний.
| TransactionFlow переплёт |
Свойство привязки TransactionFlow | Протокол привязки TransactionFlowProtocol | Тип потока транзакций |
|---|---|---|---|
| Обязательно | правда | WS-AT | Транзакция должна передаваться в интероперабельном формате WS-AT. |
| Обязательно | правда | OleTransactions | Транзакция должна передаваться в формате WCF OleTransactions. |
| Обязательно | неправда | Неприменимо | Неприменимо, так как это недопустимая конфигурация. |
| Допустимо | правда | WS-AT | Транзакция может быть передана в интероперабельном формате WS-AT. |
| Допустимо | правда | OleTransactions | Транзакция может передаваться в формате WCF OleTransactions. |
| Допустимо | неправда | Любое значение | Транзакция не выполняется. |
| Не разрешено | Любое значение | Любое значение | Транзакция не выполняется. |
В следующей таблице приводится сводка результата обработки сообщений.
| Входящее сообщение | Параметр TransactionFlow | Заголовок транзакции | Результат обработки сообщений |
|---|---|---|---|
| Транзакция соответствует ожидаемому формату протокола. | Разрешено или обязательно |
MustUnderstand равно true. |
Процедура |
| Транзакция не соответствует ожидаемому формату протокола | Обязательно |
MustUnderstand равно false. |
Отклонено, так как требуется транзакция |
| Транзакция не соответствует ожидаемому формату протокола | Допустимо |
MustUnderstand равно false. |
Отклонено, так как заголовок не понимается |
| Транзакция с использованием любого формата протокола | Не разрешено |
MustUnderstand равно false. |
Отклонено, так как заголовок не понимается |
| Нет транзакции | Обязательно | Не применимо | Отклонено, так как требуется транзакция |
| Нет транзакции | Допустимо | Не применимо | Процедура |
| Нет транзакции | Не разрешено | Не применимо | Процедура |
Хотя каждый метод контракта может иметь разные требования к потоку транзакций, параметр протокола потока транзакций ограничен на уровне привязки. Это означает, что все методы, использующие одну и ту же конечную точку (и поэтому одну и ту же привязку), также используют одну политику, разрешающую или требующую потока транзакций, а также один и тот же протокол транзакций, если это применимо.
Включение потока транзакций на уровне метода
Требования к потоку транзакций не всегда одинаковы для всех методов в контракте службы. Поэтому 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 (Svcutil.exe). Документы политики с присутствующими утверждениями транзакций в выходных сообщениях или односторонних входящих сообщениях также считаются недопустимыми.