Freigeben über


ServiceModel-Transaktionsattribute

Windows Communication Foundation (WCF) stellt Eigenschaften für drei standardmäßige System.ServiceModel-Attribute bereit, mit denen Sie das Verhalten von Transaktionen eines WCF-Diensts konfigurieren können:

TransactionFlowAttribute

Das TransactionFlowAttribute-Attribut legt die Bereitschaft eines Vorgangs in einem Dienstvertrag fest, die vom Client eingehenden Transaktionen anzunehmen. Das Attribut bietet diese Kontrolle über das folgende Attribut: Transaktionen verwenden die TransactionFlowOption-Enumeration, um festzulegen, ob eine eingehende Transaktion Mandatory, Allowed oder NotAllowedist.

Dies ist das einzige Attribut, das Dienstvorgänge zu externen Interaktionen mit einem Client verknüpft. Die in den folgenden Abschnitten beschriebenen Attribute beziehen sich auf die Verwendung von Transaktionen innerhalb der Ausführung des Vorgangs.

ServiceBehaviorAttribute

Das ServiceBehaviorAttribute-Attribut legt das interne Ausführungsverhalten einer Dienstvertragimplementierung fest. Zu den transaktionsspezifischen Eigenschaften dieses Attributs gehören:

  • TransactionAutoCompleteOnSessionClose gibt an, ob eine nicht abgeschlossene Transaktion beim Schließen der Sitzung abgeschlossen wird. Der Standardwert dieser Eigenschaft ist false. Ist diese Eigenschaft true und wurde die eingehende Sitzung ordnungsgemäß beendet, anstatt aufgrund eines Netzwerk- oder Clientfehlers geschlossen zu werden, werden alle nicht abgeschlossenen Transaktionen erfolgreich abgeschlossen. Ist diese Eigenschaft false oder wurde die Sitzung nicht ordnungsgemäß beendet, wird für alle nicht abgeschlossenen Transaktionen beim Schließen der Sitzung ein Rollback ausgeführt. Wenn diese Eigenschaft true ist, muss der eingehende Kanal sitzungsbasiert sein.

  • ReleaseServiceInstanceOnTransactionComplete legt fest, ob die zugrunde liegende Dienstinstanz beim Abschluss einer Transaktion freigegeben wird. Der Standardwert dieser Eigenschaft ist true. Die nächste eingehende Nachricht verursacht die Erstellung einer neuen zugrunde liegenden Instanz, wobei der Pro-Transaktionsstatus, über den die vorherige Instanz möglicherweise verfügte, verworfen wird. Die Freigabe einer Dienstinstanz ist eine interne Aktion, die der Dienst durchführt, und hat keinen Einfluss auf bestehende Verbindungen oder Sitzungen, die von Clients möglicherweise aufgebaut wurden. Diese Funktionalität entspricht der JIT-Aktivierungsfunktion (Just-in-Time), die COM+ bereitstellt. Wenn die Eigenschaft true ist, muss ConcurrencyMode gleich Single sein. Andernfalls löst der Dienst während des Starts eine ungültige Konfigurationsvalidierungsausnahme aus.

  • TransactionIsolationLevel legt die Isolationsebene fest, die für Transaktionen innerhalb eines Diensts verwendet wird. Diese Eigenschaft nimmt einen der IsolationLevel-Werte an. Ist die Isolationsebeneneigenschaft etwas anderes als Unspecified, muss die Isolationsebene einer eingehenden Transaktion der Einstellung dieser lokalen Eigenschaft entsprechen. Andernfalls wird die eingehende Transaktion abgelehnt, und ein Fehler wird an den Client zurückgesendet. Wenn TransactionScopeRequiredtrue ist und keine Transaktion übergeben wird, bestimmt diese Eigenschaft den für die lokal erstellte Transaktion zu verwendenden IsolationLevel-Wert. Wenn IsolationLevel auf Unspecified festgelegt ist, wird IsolationLevelSerializable verwendet.

  • TransactionTimeout legt den Zeitraum fest, innerhalb dessen eine neue, am Dienst erstellte Transaktion abgeschlossen sein muss. Ist dieser Zeitpunkt erreicht und wurde die Transaktion nicht abgeschlossen, wird sie abgebrochen. Die TimeSpan wird als TransactionScope-Timeout für alle Vorgänge verwendet, bei denen TransactionScopeRequired auf true gesetzt ist und für die eine neue Transaktion erstellt worden war. Der Timeout ist die maximal zulässige Dauer von der Erstellung einer Transaktion bis zum Abschluss der Phase 1 im Zweiphasen-Commitprotokoll. Der verwendete Timeout ist immer der niedrigere Wert der TransactionTimeout-Eigenschaft und der transactionTimeout-Konfigurationseinstellung.

OperationBehaviorAttribute

Das OperationBehaviorAttribute-Attribut legt die Verhaltensweisen der Methoden in der Dienstimplementierung fest. Sie können es verwenden, um das spezifische Ausführungsverhalten des Vorgangs anzugeben. Die Eigenschaften dieses Attributs haben keine Auswirkungen auf die WSDL-Beschreibung (Web Service Description Language) des Dienstvertrags. Es handelt sich lediglich um Elemente des WCF-Programmiermodells, die übliche Features ermöglichen, die Entwickler andernfalls selbst implementieren müssen.

Dieses Attribut verfügt über die folgenden transaktionsspezifischen Eigenschaften:

  • TransactionScopeRequired gibt an, ob eine Methode innerhalb eines aktiven Transaktionsbereichs ausgeführt werden muss. Der Standardwert lautet false. Ist das OperationBehaviorAttribute-Attribut für eine Methode nicht eingerichtet, wird darüber hinaus angegeben, dass die Methode in einer Transaktion nicht ausgeführt wird. Wird für einen Vorgang kein Transaktionsumfang benötigt, sind alle im Nachrichtenheader vorhandenen Transaktionen nicht aktiviert und bleiben ein Element der IncomingMessageProperties des OperationContext. Ist für einen Vorgang ein Transaktionsumfang erforderlich, leitet sich die Quelle für die Transaktion folgendermaßen ab:

    • Wenn eine Transaktion von einem Client übergeben wird, wird die Methode unter einem Transaktionsumfang ausgeführt, der mithilfe der verteilten Transaktion erstellt wurde.

    • Bei einer in der Warteschlange befindlichen Transaktion wird die Transaktion verwendet, die zum Entfernen der Nachricht aus der Warteschlange zum Einsatz kommt. Beachten Sie, dass es sich bei der verwendeten Transaktion nicht um eine übertragene Transaktion handelt, da diese nicht vom Originalabsender der Nachricht bereitgestellt wurde.

    • Ein benutzerdefinierter Transport kann durch die Verwendung der TransportTransactionProperty eine Transaktion bereitstellen.

    • Wenn keiner der oben aufgeführten Posten eine externe Quelle für eine Transaktion bereitstellt, wird eine neue Transaction-Instanz direkt vor dem Aufruf der Methode erstellt.

  • TransactionAutoComplete legt fest, ob die Transaktion, in der die Methode ausgeführt wird, automatisch abgeschlossen wird, wenn keine Ausnahmefehler ausgelöst werden. Ist diese Eigenschaft true, kennzeichnet die aufrufende Infrastruktur die Transaktion automatisch als „abgeschlossen“, wenn die Benutzermethode zurückgegeben wird, ohne dass eine Ausnahme ausgelöst wird. Ist diese Eigenschaft false, wird die Transaktion an die Instanz angehängt und nur als "abgeschlossen" gekennzeichnet, wenn der Client eine nachfolgende Methode aufruft, die mit dieser Eigenschaft auf true gekennzeichnet ist, oder wenn eine nachfolgende Methode explizit SetTransactionComplete aufruft. Wird keiner der genannten Posten durchgeführt, wird die Transaktion nie abgeschlossen und die darin befindliche Arbeit wird nicht ausgeführt, es sei denn die TransactionAutoCompleteOnSessionClose-Eigenschaft ist auf true gesetzt. Ist diese Eigenschaft auf true gesetzt, müssen Sie einen Kanal mit einer Sitzung verwenden und der InstanceContextMode muss auf PerSession gesetzt sein.