Włączanie przepływu transakcji
Program Windows Communication Foundation (WCF) zapewnia wysoce elastyczne opcje kontrolowania przepływu transakcji. Ustawienia przepływu transakcji usługi można wyrazić przy użyciu kombinacji atrybutów i konfiguracji.
Ustawienia przepływu transakcji
Ustawienia przepływu transakcji są generowane dla punktu końcowego usługi w wyniku przecięcia następujących trzech wartości:
Atrybut TransactionFlowAttribute określony dla każdej metody w kontrakcie usługi.
Właściwość
TransactionFlow
powiązania w określonym powiązaniu.Właściwość
TransactionFlowProtocol
powiązania w określonym powiązaniu. WłaściwośćTransactionFlowProtocol
powiązania umożliwia wybór spośród dwóch różnych protokołów transakcji, których można użyć do przepływu transakcji. W poniższych sekcjach krótko opisano każdy z nich.
Protokół WS-AtomicTransaction
Protokół WS-AtomicTransaction (WS-AT) jest przydatny w scenariuszach, gdy wymagana jest współdziałanie ze stosami protokołów innych firm.
Protokół OleTransactions
Protokół OleTransactions jest przydatny w scenariuszach, gdy współdziałanie z stosami protokołów innych firm nie jest wymagane, a moduł wdrażający usługi z wyprzedzeniem wie, że usługa protokołu WS-AT jest wyłączona lokalnie lub istniejąca topologia sieci nie sprzyja użyciu usługi WS-AT.
W poniższej tabeli przedstawiono różne typy przepływów transakcji, które można wygenerować przy użyciu tych różnych kombinacji.
Transactionflow powiązanie |
Właściwość powiązania TransactionFlow | Protokół powiązania TransactionFlowProtocol | Typ przepływu transakcji |
---|---|---|---|
Obowiązkowy | prawda | WS-AT | Transakcja musi być przepływana w formacie WS-AT. |
Obowiązkowy | prawda | Oletransactions | Transakcje muszą być przepływane w formacie WCF OleTransactions. |
Obowiązkowy | fałsz | Nie dotyczy | Nie dotyczy, ponieważ jest to nieprawidłowa konfiguracja. |
Dozwolone | prawda | WS-AT | Transakcja może być przepływana w formacie WS-AT. |
Dozwolone | prawda | Oletransactions | Transakcje mogą być przepływane w formacie WCF OleTransactions. |
Dozwolone | fałsz | Dowolna wartość | Transakcja nie jest przepływana. |
Notallowed | Dowolna wartość | Dowolna wartość | Transakcja nie jest przepływana. |
Poniższa tabela zawiera podsumowanie wyniku przetwarzania komunikatów.
Wiadomość przychodząca | Ustawienie TransactionFlow | Nagłówek transakcji | Wynik przetwarzania komunikatów |
---|---|---|---|
Format protokołu oczekiwanego dopasowania transakcji | Dozwolone lub obowiązkowe | MustUnderstand true równa się . |
Przetwarzaj |
Transakcja nie jest zgodna z oczekiwanym formatem protokołu | Obowiązkowy | MustUnderstand false równa się . |
Odrzucono, ponieważ wymagana jest transakcja |
Transakcja nie jest zgodna z oczekiwanym formatem protokołu | Dozwolone | MustUnderstand false równa się . |
Odrzucono, ponieważ nagłówek nie jest zrozumiały |
Transakcja przy użyciu dowolnego formatu protokołu | Notallowed | MustUnderstand false równa się . |
Odrzucono, ponieważ nagłówek nie jest zrozumiały |
Brak transakcji | Obowiązkowy | Nie dotyczy | Odrzucono, ponieważ wymagana jest transakcja |
Brak transakcji | Dozwolone | Nie dotyczy | Przetwarzaj |
Brak transakcji | Notallowed | Nie dotyczy | Przetwarzaj |
Chociaż każda metoda kontraktu może mieć różne wymagania dotyczące przepływu transakcji, ustawienie protokołu przepływu transakcji jest ograniczone na poziomie powiązania. Oznacza to, że wszystkie metody współużytkujące ten sam punkt końcowy (i w związku z tym to samo powiązanie) również współdzielą te same zasady zezwalające na przepływ transakcji lub wymagające ich przepływu, a także ten sam protokół transakcji, jeśli ma to zastosowanie.
Włączanie przepływu transakcji na poziomie metody
Wymagania dotyczące przepływu transakcji nie zawsze są takie same dla wszystkich metod w kontrakcie usługi. W związku z tym program WCF udostępnia również mechanizm oparty na atrybutach, aby umożliwić wyrażanie preferencji przepływu transakcji każdej metody. Jest to osiągane przez parametr TransactionFlowAttribute określający poziom, na którym operacja usługi akceptuje nagłówek transakcji. Jeśli chcesz włączyć przepływ transakcji, należy oznaczyć metody kontraktu usługi za pomocą tego atrybutu. Ten atrybut przyjmuje jedną z wartości TransactionFlowOption wyliczenia, w którym wartość domyślna to NotAllowed. Jeśli jakakolwiek wartość z wyjątkiem NotAllowed jest określona, metoda jest wymagana, aby nie być jednokierunkowa. Deweloper może użyć tego atrybutu, aby określić wymagania dotyczące przepływu transakcji na poziomie metody lub ograniczenia w czasie projektowania.
Włączanie przepływu transakcji na poziomie punktu końcowego
Oprócz ustawienia TransactionFlowAttribute przepływu transakcji na poziomie metody zapewnia atrybut, program WCF udostępnia ustawienie całego punktu końcowego dla przepływu transakcji, aby umożliwić administratorom kontrolowanie przepływu transakcji na wyższym poziomie.
Jest to osiągane przez element TransactionFlowBindingElement, który umożliwia włączenie lub wyłączenie przepływu transakcji przychodzących w ustawieniach powiązania punktu końcowego, a także określenie żądanego formatu protokołu transakcji dla transakcji przychodzących.
Jeśli powiązanie wyłączyło przepływ transakcji, ale jedna z operacji na kontrakcie usługi wymaga transakcji przychodzącej, zostanie zgłoszony wyjątek weryfikacji podczas uruchamiania usługi.
Większość powiązań stałych WCF zawiera transactionFlow
atrybuty i transactionProtocol
umożliwiające skonfigurowanie określonego powiązania w celu akceptowania transakcji przychodzących. Aby uzyskać więcej informacji na temat ustawiania elementów konfiguracji, zobacz wiązanie>.<
Administrator lub wdrożenie może użyć przepływu transakcji na poziomie punktu końcowego w celu skonfigurowania wymagań lub ograniczeń przepływu transakcji w czasie wdrażania przy użyciu pliku konfiguracji.
Zabezpieczenia
Aby zapewnić bezpieczeństwo i integralność systemu, należy zabezpieczyć wymianę komunikatów podczas przepływu transakcji między aplikacjami. Nie należy przekazywać ani ujawniać szczegółów transakcji do żadnej aplikacji, która nie ma prawa do udziału w tej samej transakcji.
W przypadku generowania klientów WCF do nieznanych lub niezaufanych usług sieci Web przy użyciu wymiany metadanych wywołania operacji na tych usługach sieci Web powinny pominąć bieżącą transakcję, jeśli to możliwe. Poniższy przykład demonstruje, jak to zrobić.
//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
Ponadto usługi należy skonfigurować tak, aby akceptowały transakcje przychodzące tylko od klientów, którzy zostali uwierzytelnieni i autoryzowani. Transakcje przychodzące powinny być akceptowane tylko wtedy, gdy pochodzą one z wysoce zaufanych klientów.
Asercji zasad
Program WCF używa asercji zasad do kontrolowania przepływu transakcji. Asercji zasad można znaleźć w dokumencie zasad usługi, który jest generowany przez agregowanie kontraktów, konfiguracji i atrybutów usługi. Klient może uzyskać dokument zasad usługi przy użyciu żądania HTTP GET lub WS-MetadataExchange request-reply. Klienci mogą następnie przetworzyć dokument zasad, aby określić, które operacje w umowie usługi mogą obsługiwać lub wymagać przepływu transakcji.
Asercji zasad przepływu transakcji wpływają na przepływ transakcji, określając nagłówki protokołu SOAP, które klient powinien wysłać do usługi w celu reprezentowania transakcji. Wszystkie nagłówki transakcji muszą być oznaczone MustUnderstand
jako równe true
. Każdy komunikat z nagłówkiem oznaczonym w przeciwnym razie jest odrzucany z błędem protokołu SOAP.
Tylko jedna asercja zasad związanych z transakcjami może być obecna w jednej operacji. Dokumenty zasad z więcej niż jedną asercją transakcji operacji są uznawane za nieprawidłowe i są odrzucane przez usługę WCF. Ponadto w każdym typie portu może znajdować się tylko jeden protokół transakcji. Dokumenty zasad z operacjami odwołujące się do więcej niż jednego protokołu transakcji wewnątrz jednego typu portu są uznawane za nieprawidłowe i są odrzucane przez narzędzie ServiceModel Metadata Tool (Svcutil.exe). Dokumenty zasad z asercji transakcji obecnych w komunikatach wyjściowych lub jednokierunkowych komunikatach wejściowych są również uznawane za nieprawidłowe.