Attivazione del flusso delle transazioni
In Windows Communication Foundation (WCF) sono disponibili opzioni estremamente flessibili per il controllo del flusso delle transazioni. Le impostazioni del flusso delle transazioni di un servizio possono essere espresse con una determinata combinazione di attributi e configurazione.
Impostazioni del flusso delle transazioni
Le impostazioni del flusso delle transazioni vengono generate per un endpoint del servizio come esito dell'intersezione dei tre valori seguenti:
L'attributo TransactionFlowAttribute specificato per ogni metodo contenuto nel contratto di servizio.
La proprietà TransactionFlow nella specifica associazione.
La proprietà TransactionFlowProtocol nella specifica associazione. La proprietà TransactionFlowProtocol di associazione consente di scegliere fra due protocolli di transazione diversi che è possibile utilizzare per propagare una transazione. Questi valori vengono descritti brevemente nelle sezioni seguenti.
Protocollo WS-AtomicTransaction
Il protocollo WS-AtomicTransaction (WS-AT) è utile per scenari in cui è richiesta l'interoperabilità con stack del protocollo di terze parti.
Protocollo OleTransactions
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.
Nella tabella seguente sono mostrati i tipi diversi di flussi delle transazioni che possono essere generati utilizzando queste varie combinazioni.
TransactionFlow associazione | Proprietà di associazione TransactionFlow | Proprietà di associazione TransactionFlowProtocol | Tipo del flusso delle transazioni |
---|---|---|---|
Obbligatorio |
true |
WS-AT |
La transazione deve essere propagata nel formato WS-AT interoperativo. |
Obbligatorio |
true |
OleTransactions |
La transazione deve essere propagata nel formato OleTransactions di WCF. |
Obbligatorio |
false |
Non applicabile |
Non applicabile perché questa configurazione non è valida. |
Allowed |
true |
WS-AT |
La transazione può essere propagata nel formato WS-AT interoperativo. |
Allowed |
true |
OleTransactions |
La transazione può essere propagata nel formato OleTransactions di WCF. |
Allowed |
false |
Qualsiasi valore |
Una transazione non è propagata. |
NotAllowed |
Qualsiasi valore |
Qualsiasi valore |
Una transazione non è propagata. |
Nella tabella seguente viene fornito un riepilogo del risultato di elaborazione dei messaggi.
Messaggio in arrivo. | Impostazioni di TransactionFlow | Intestazione della transazione | Risultato di elaborazione del messaggio |
---|---|---|---|
La transazione corrisponde al formato previsto del protocollo |
Consentito o obbligatorio |
MustUnderstand equivale a true. |
Process |
La transazione non corrisponde al formato previsto del protocollo |
Obbligatorio |
MustUnderstand equivale a false. |
Rifiutato perché una transazione è obbligatoria |
La transazione non corrisponde al formato previsto del protocollo |
Allowed |
MustUnderstand equivale a false. |
Rifiutato perché l'intestazione non è compresa |
Transazione che utilizza qualsiasi formato di protocollo |
NotAllowed |
MustUnderstand equivale a false. |
Rifiutato perché l'intestazione non è compresa |
Nessuna transazione |
Obbligatorio |
N/D |
Rifiutato perché una transazione è obbligatoria |
Nessuna transazione |
Allowed |
N/D |
Process |
Nessuna transazione |
NotAllowed |
N/D |
Process |
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. 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.
Attivazione del flusso delle transazioni a livello di metodo
I requisiti del flusso delle transazioni non sono sempre gli stessi per tutti i metodi di un contratto di servizio. WCF, quindi, fornisce un meccanismo basato su un attributo che consente l'espressione di preferenze relativamente al flusso delle transazioni di ogni metodo. TransactionFlowAttribute, infatti, consente di specificare il livello al quale un'operazione del servizio accetta un'intestazione di transazione. Se si desidera attivare il flusso delle transazioni, è necessario contrassegnare i metodi del contratto di servizio con questo attributo. L'attributo accetta uno dei valori dell'enumerazione TransactionFlowOption, in cui il valore predefinito è NotAllowed. Se si specifica qualsiasi valore ad eccezione di NotAllowed, è necessario che il metodo non sia unidirezionale. 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.
Attivazione del flusso delle transazioni a livello di endpoint
Oltre all'impostazione del flusso di transazioni a livello di metodo fornita dall'attributo TransactionFlowAttribute, in WCF è inoltre disponibile un'impostazione a livello di endpoint per il flusso di transazioni che consente agli amministratori di controllare il flusso a un livello superiore.
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.
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.
La maggior parte delle associazioni permanenti fornite in WCF contiene gli attributi transactionFlow e transactionProtocol che consentono di configurare l'associazione specifica perché accetti transazioni in arrivo. Per ulteriori informazioni su sull'impostazione degli elementi di configurazione, vedere <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.
Protezione
Per garantire la protezione e l'integrità del sistema, è necessario proteggere gli scambi di messaggi durante la propagazione delle transazioni tra applicazioni. È necessario non propagare o divulgare dettagli delle transazioni ad applicazioni non autorizzate a partecipare alla stessa transazione.
Durante la generazione di client WCF a servizi Web ignoti o non attendibili tramite lo scambio di metadati, le chiamate alle operazioni in questi servizi Web devono, se possibile, sopprimere la transazione corrente. Nell'esempio seguente viene illustrato come procedere.
//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. Le transazioni in arrivo devono essere accettate solo se provengono da client estremamente attendibili.
Asserzioni di criteri
In WCF vengono utilizzate asserzioni di criteri per controllare il flusso delle transazioni. Le asserzioni di criteri possono trovarsi nel documento dei criteri di un servizio, generato aggregando contratti, configurazione e attributi. Il client può ottenere il documento dei criteri del servizio utilizzando un GET HTTP o un request/reply di WS-MetadataExchange. 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.
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. Tutte le intestazioni di transazione devono essere contrassegnate con MustUnderstand uguale a true. Qualsiasi messaggio con un'intestazione contrassegnata diversamente viene rifiutato con un errore SOAP.
In una singola operazione può essere presente solo un'asserzione di criteri correlata alla transazione. I documenti di criteri con più di un'asserzione della transazione su un'operazione vengono considerati non validi e vengono rifiutati da WCF. In ogni tipo di porta, inoltre, può essere presente solo un protocollo di transazione. I documenti di criteri con 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 da Strumento 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.