Attivazione del flusso delle transazioniEnabling Transaction Flow

Windows Communication Foundation (WCF) disponibili opzioni estremamente flessibili per controllare il flusso delle transazioni.Windows Communication Foundation (WCF) provides highly flexible options for controlling transaction flow. Le impostazioni del flusso delle transazioni di un servizio possono essere espresse con una determinata combinazione di attributi e configurazione.A service's transaction flow settings can be expressed using a combination of attributes and configuration.

Impostazioni del flusso delle transazioniTransaction Flow Settings

Le impostazioni del flusso delle transazioni vengono generate per un endpoint del servizio come esito dell'intersezione dei tre valori seguenti:Transaction flow settings are generated for a service endpoint as a result of the intersection of the following three values:

  • L'attributo TransactionFlowAttribute specificato per ogni metodo contenuto nel contratto di servizio.The TransactionFlowAttribute attribute specified for each method in the service contract.

  • La proprietà TransactionFlow nella specifica associazione.The TransactionFlow binding property in the specific binding.

  • La proprietà TransactionFlowProtocol nella specifica associazione.The TransactionFlowProtocol binding property in the specific binding. La proprietà TransactionFlowProtocol di associazione consente di scegliere fra due protocolli di transazione diversi che è possibile utilizzare per propagare una transazione.The TransactionFlowProtocol binding property enables you to choose among two different transaction protocols that you can use to flow a transaction. Questi valori vengono descritti brevemente nelle sezioni seguenti.The following sections briefly describe each of them.

Protocollo WS-AtomicTransactionWS-AtomicTransaction Protocol

Il protocollo WS-AtomicTransaction (WS-AT) è utile per scenari in cui è richiesta l'interoperabilità con stack del protocollo di terze parti.The WS-AtomicTransaction (WS-AT) protocol is useful for scenarios when interoperability with third-party protocol stacks is required.

Protocollo OleTransactionsOleTransactions Protocol

Il protocollo OleTransactions è utile per gli scenari in cui l'interoperabilità con stack del protocollo di terze parti non è necessario e il distributore di un servizio sa in anticipo che il servizio del protocollo WS-AT è disattivato localmente o che la topologia di rete esistente non favorisce l'utilizzo di WS-AT.The OleTransactions protocol is useful for scenarios when interoperability with third-party protocol stacks is not required, and the deployer of a service knows in advance that the WS-AT protocol service is disabled locally or the existing network topology does not favor the usage of WS-AT.

Nella tabella seguente sono mostrati i tipi diversi di flussi delle transazioni che possono essere generati utilizzando queste varie combinazioni.The following table shows the different types of transaction flows that can be generated using these various combinations.

TransactionFlowTransactionFlow

bindingbinding
Proprietà di associazione TransactionFlowTransactionFlow binding property Proprietà di associazione TransactionFlowProtocolTransactionFlowProtocol binding protocol Tipo del flusso delle transazioniType of transaction flow
ObbligatorioMandatory truetrue WS-ATWS-AT La transazione deve essere propagata nel formato WS-AT interoperativo.Transaction must be flowed in the interoperable WS-AT format.
ObbligatorioMandatory truetrue OleTransactionsOleTransactions Transazione deve essere propagata nel formato OleTransactions di WCF.Transaction must be flowed in the WCF OleTransactions format.
ObbligatorioMandatory Falsefalse Non applicabileNot applicable Non applicabile perché questa configurazione non è valida.Not applicable because this is an invalid configuration.
AllowedAllowed truetrue WS-ATWS-AT La transazione può essere propagata nel formato WS-AT interoperativo.Transaction may be flowed in the interoperable WS-AT format.
AllowedAllowed truetrue OleTransactionsOleTransactions Transazione può essere propagata nel formato OleTransactions di WCF.Transaction may be flowed in the WCF OleTransactions format.
AllowedAllowed Falsefalse Qualsiasi valoreAny value Una transazione non è propagata.A transaction is not flowed.
NotAllowedNotAllowed Qualsiasi valoreAny value Qualsiasi valoreAny value Una transazione non è propagata.A transaction is not flowed.

Nella tabella seguente viene fornito un riepilogo del risultato di elaborazione dei messaggi.The following table summarizes the message processing result.

Messaggio in arrivo.Incoming message Impostazioni di TransactionFlowTransactionFlow setting Intestazione della transazioneTransaction header Risultato di elaborazione del messaggioMessage processing result
La transazione corrisponde al formato previsto del protocolloTransaction matches expected protocol format Consentito o obbligatorioAllowed or Mandatory MustUnderstand è uguale a true.MustUnderstand equals true. ProcessProcess
La transazione non corrisponde al formato previsto del protocolloTransaction does not match expected protocol format ObbligatorioMandatory MustUnderstand è uguale a false.MustUnderstand equals false. Rifiutato perché una transazione è obbligatoriaRejected because a transaction is required
La transazione non corrisponde al formato previsto del protocolloTransaction does not match expected protocol format AllowedAllowed MustUnderstand è uguale a false.MustUnderstand equals false. Rifiutato perché l'intestazione non è compresaRejected because the header is not understood
Transazione che utilizza qualsiasi formato di protocolloTransaction using any protocol format NotAllowedNotAllowed MustUnderstand è uguale a false.MustUnderstand equals false. Rifiutato perché l'intestazione non è compresaRejected because the header is not understood
Nessuna transazioneNo transaction ObbligatorioMandatory N/DN/A Rifiutato perché una transazione è obbligatoriaRejected because a transaction is required
Nessuna transazioneNo transaction AllowedAllowed N/DN/A ProcessProcess
Nessuna transazioneNo transaction NotAllowedNotAllowed N/DN/A ProcessProcess

Mentre ogni metodo di un contratto può disporre di requisiti diversi per il flusso delle transazioni, l'impostazione del protocollo relativo al flusso delle transazioni è limitato all'ambito del livello dell'associazione.While each method on a contract can have different transaction flow requirements, the transaction flow protocol setting is scoped at the level of the binding. Tutti i metodi che condividono lo stesso endpoint, e di conseguenza la stessa associazione, condividono inoltre lo stesso criterio che ammette o richiede un flusso di transazioni, nonché, se opportuno, lo stesso protocollo di transazione.This means that all methods that share the same endpoint (and therefore the same binding) also share the same policy allowing or requiring transaction flow, as well as the same transaction protocol if applicable.

Attivazione del flusso delle transazioni a livello di metodoEnabling Transaction Flow at the Method Level

I requisiti del flusso delle transazioni non sono sempre gli stessi per tutti i metodi di un contratto di servizio.Transaction flow requirements are not always the same for all methods in a service contract. Di conseguenza, WCF offre inoltre un meccanismo basato su attributi per consentire le preferenze di flusso delle transazioni di ciascun metodo può essere espresso.Therefore, WCF also provides an attribute-based mechanism to allow each method's transaction flow preferences to be expressed. TransactionFlowAttribute, infatti, consente di specificare il livello al quale un'operazione del servizio accetta un'intestazione di transazione.This is achieved by the TransactionFlowAttribute that specifies the level in which a service operation accepts a transaction header. Se si desidera attivare il flusso delle transazioni, è necessario contrassegnare i metodi del contratto di servizio con questo attributo.You should mark your service contract methods with this attribute if you want to enable transaction flow. L'attributo accetta uno dei valori dell'enumerazione TransactionFlowOption, in cui il valore predefinito è NotAllowed.This attribute takes one of the values of the TransactionFlowOption enumeration, in which the default value is NotAllowed. Se si specifica qualsiasi valore ad eccezione di NotAllowed, è necessario che il metodo non sia unidirezionale.If any value except NotAllowed is specified, the method is required to not be one-way. Gli sviluppatori possono utilizzare questo attributo per specificare i requisiti del flusso delle transazioni a livello di metodo o i vincoli in fase di progettazione.A developer can use this attribute to specify method-level transaction flow requirements or constraints at design time.

Attivazione del flusso delle transazioni a livello di endpointEnabling Transaction Flow at the Endpoint Level

Oltre a impostare il flusso delle transazioni a livello di metodo di TransactionFlowAttribute attributo fornisce, WCF fornisce un'impostazione a livello di endpoint per il flusso delle transazioni per consentire agli amministratori di controllare il flusso delle transazioni a un livello superiore.In addition to the method-level transaction flow setting the TransactionFlowAttribute attribute provides, WCF provides an endpoint-wide setting for transaction flow to allow administrators to control transaction flow at a higher level.

Questa possibilità è data da TransactionFlowBindingElement, che consente di attivare o disattivare il flusso delle transazioni in arrivo nelle impostazioni di associazione di un endpoint, nonché di specificare il formato del protocollo di transazione desiderato per le transazioni in arrivo.This is achieved by the TransactionFlowBindingElement, which enables you to enable or disable incoming transaction flow in an endpoint’s binding settings, as well as to specify the desired transaction protocol format for incoming transactions.

Se nell'associazione il flusso delle transazioni è disattivato ma una delle operazioni di un contratto di servizio richiede una transazione in arrivo, in fase di avvio del servizio viene generata un'eccezione di convalida.If the binding has disabled transaction flow, but one of the operations on a service contract requires an incoming transaction, then a validation exception is thrown at service startup.

La maggior parte delle associazioni permanenti WCF fornisce contengono le transactionFlow e transactionProtocol attributi che consentono di configurare l'associazione specifica perché accetti transazioni in ingresso.Most of the standing bindings WCF provides contain the transactionFlow and transactionProtocol attributes to enable you to configure the specific binding to accept incoming transactions. Per altre informazioni sull'impostazione degli elementi di configurazione, vedere <associazione >.For more information about setting the configuration elements, see <binding>.

Gli amministratori o i distributori possono avvalersi del flusso delle transazioni a livello di endpoint per configurare i requisiti del flusso o i vincoli in fase di distribuzione utilizzando il file di configurazione.An administrator or deployer can use endpoint-level transaction flow to configure transaction flow requirements or constraints at deployment time using the configuration file.

SicurezzaSecurity

Per garantire la protezione e l'integrità del sistema, è necessario proteggere gli scambi di messaggi durante la propagazione delle transazioni tra applicazioni.To ensure system security and integrity, you must secure message exchanges when flowing transactions between applications. È necessario non propagare o divulgare dettagli delle transazioni ad applicazioni non autorizzate a partecipare alla stessa transazione.You should not flow or disclose transaction details to any application that is not entitled to participate in the same transaction.

Durante la generazione di client WCF ai servizi Web sconosciuti o non attendibili tramite l'uso di scambio di metadati, le chiamate alle operazioni in questi servizi Web devono eliminare la transazione corrente se possibile.When generating WCF clients to unknown or untrusted Web services through the use of metadata exchange, calls to operations on these Web services should suppress the current transaction if possible. Nell'esempio riportato di seguito viene illustrato come procedere.The following example demonstrates how to do this.

//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  

I servizi, inoltre, devono essere configurati per accettare transazioni in arrivo solo dai client che hanno autenticato e autorizzato.In addition, services should be configured to accept incoming transactions only from clients that they have authenticated and authorized. Le transazioni in arrivo devono essere accettate solo se provengono da client estremamente attendibili.Incoming transactions should only be accepted if they come from highly trusted clients.

Asserzioni di criteriPolicy Assertions

WCF utilizza le asserzioni di criteri per controllare il flusso delle transazioni.WCF uses policy assertions to control transaction flow. Le asserzioni di criteri possono trovarsi nel documento dei criteri di un servizio, generato aggregando contratti, configurazione e attributi.Policy assertions can be found in a service’s policy document, which is generated by aggregating contracts, configuration, and attributes. Il client può ottenere il documento dei criteri del servizio utilizzando un GET HTTP o un request/reply di WS-MetadataExchange.The client can obtain the service’s policy document using an HTTP GET or a WS-MetadataExchange request-reply. I client possono quindi elaborare il documento dei criteri per determinare quali operazioni di un contratto di servizio possono supportare o richiedere il flusso delle transazioni.Clients can then process the policy document to determine which operations on a service contract may support or require transaction flow.

Le asserzioni di criteri di un flusso di transazioni incidono sul flusso stesso specificando le intestazioni SOAP che un client deve inviare a un servizio per rappresentare una transazione.Transaction flow policy assertions affect transaction flow by specifying the SOAP headers that a client should send to a service to represent a transaction. Tutte le intestazioni di transazione devono essere contrassegnate con MustUnderstand uguale a true.All transaction headers must be marked with MustUnderstand equal to true. Qualsiasi messaggio con un'intestazione contrassegnata diversamente viene rifiutato con un errore SOAP.Any message with a header marked otherwise is rejected with a SOAP fault.

In una singola operazione può essere presente solo un'asserzione di criteri correlata alla transazione.Only one transaction-related policy assertion can be present on a single operation. Documenti di criteri con più di un'asserzione della transazione su un'operazione vengono considerati non validi e vengono rifiutati da WCF.Policy documents with more than one transaction assertion on an operation are considered invalid and are rejected by WCF. In ogni tipo di porta, inoltre, può essere presente solo un protocollo di transazione.In addition, only a single transaction protocol can be present inside each port type. I documenti di criteri con le operazioni che fanno riferimento a più di un protocollo di transazione all'interno di un solo tipo di porta vengono considerati non validi e vengono rifiutati dal ServiceModel Metadata Utility Tool (Svcutil.exe).Policy documents with operations referencing more than one transaction protocol inside a single port type are considered invalid, and are rejected by the ServiceModel Metadata Utility Tool (Svcutil.exe). I documenti di criteri con asserzioni di transazione presenti nei messaggi di output o nei messaggi di input unidirezionali vengono inoltre considerati non validi.Policy documents with transaction assertions present on output messages or one-way input messages are also considered invalid.