Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le applicazioni Windows Communication Foundation (WCF) possono avviare una transazione dall'interno di un client e coordinare la transazione all'interno dell'operazione del servizio. I client possono avviare una transazione e richiamare diverse operazioni del servizio e assicurarsi che venga eseguito il commit o il rollback delle operazioni del servizio come singola unità.
È possibile abilitare il comportamento delle transazioni nel contratto di servizio specificando un ServiceBehaviorAttribute e impostando le sue proprietà TransactionIsolationLevel e TransactionScopeRequired per le operazioni del servizio che richiedono transazioni client. Il TransactionAutoComplete parametro specifica se la transazione in cui viene eseguito il metodo viene completata automaticamente se non vengono generate eccezioni non gestite. Per altre informazioni su questi attributi, vedere Attributi delle transazioni ServiceModel.
Il lavoro eseguito nelle operazioni del servizio e gestito da un gestore risorse, ad esempio la registrazione degli aggiornamenti del database, fa parte della transazione del client.
L'esempio seguente illustra l'utilizzo degli attributi ServiceBehaviorAttribute e OperationBehaviorAttribute per controllare il comportamento delle transazioni lato servizio.
[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]
public class CalculatorService: ICalculatorLog
{
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Add(double n1, double n2)
{
recordToLog($"Added {n1} to {n2}");
return n1 + n2;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Subtract(double n1, double n2)
{
recordToLog($"Subtracted {n1} from {n2}");
return n1 - n2;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Multiply(double n1, double n2)
{
recordToLog($"Multiplied {n1} by {n2}");
return n1 * n2;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Divide(double n1, double n2)
{
recordToLog($"Divided {n1} by {n2}", n1, n2);
return n1 / n2;
}
}
È possibile abilitare transazioni e flusso di transazioni configurando le associazioni client e di servizio per usare il protocollo WS-AtomicTransaction e impostando l'elemento <transactionFlow> su true
, come illustrato nella configurazione di esempio seguente.
<client>
<endpoint address="net.tcp://localhost/ServiceModelSamples/service"
binding="netTcpBinding"
bindingConfiguration="netTcpBindingWSAT"
contract="Microsoft.ServiceModel.Samples.ICalculatorLog" />
</client>
<bindings>
<netTcpBinding>
<binding name="netTcpBindingWSAT"
transactionFlow="true"
transactionProtocol="WSAtomicTransactionOctober2004" />
</netTcpBinding>
</bindings>
I client possono avviare una transazione creando un oggetto TransactionScope e richiamando le operazioni del servizio nell'ambito della transazione.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
//Do work here
ts.Complete();
}