Questa modalità operativa può risultare utile nel caso in cui si utilizzi un layer WCF service per le connessioni e le operazioni alla base dati.
Per utilizzare questo tipo di transazioni avremo bisogno di includere la classe System.Transactions.
Di seguito la reference per capirne il funzionamento:
Per prima cosa sarà necessario abilitare la transazione al nostro servizio.
Per fare ciò, sarà necessario decorare la firma dei metodi nella nostra interfaccia WCF (ServiceContract) nel seguente modo:
Per fare ciò, sarà necessario decorare la firma dei metodi nella nostra interfaccia WCF (ServiceContract) nel seguente modo:
[TransactionFlow(TransactionFlowOption.Allowed)]
Questo permetterà specificare che l'operazione del servizio accetta l'utilizzo delle transazioni da parte del client.
Abilitare quindi la transazione al metodo del servizio, decorandolo con il seguente OperationBehavior:
[OperationBehavior(TransactionScopeRequired = true)]
Configurare il servizio nel seguente modo:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="TransactionalBind" transactionFlow="true">
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="Transaction.service">
<endpoint address="" contract="Transaction.Iservice" binding="wsHttpBinding" bindingConfiguration="TransactionalBind"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
</system.serviceModel>
NB:
- è necessario che il servizio venga esposto con il protocollo di trasporto wsHttpBindings
- è necessario specificare l'attributo transactionFlow="true" per permettere l'abilitazione delle transazioni alla connessione wsHttpBindings.
<binding name="WSHttpBinding_Iservice" transactionFlow="true">
Siamo pronti a questo punto per effettuare le chiamate al nostro servizio.
Faremo ciò utilizzando una transazione che specificheremo tramite la direttiva using:
Faremo ciò utilizzando una transazione che specificheremo tramite la direttiva using:
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
{
try
{
Service.IserviceClient obj = new Service.IserviceClient();
obj.DO1();
obj.DO2();
//throw
new Exception("test new exception");
ts.Complete();
}
catch (Exception ex)
{
ts.Dispose();
}
}
Il metodo Complete eseguirà il commit della transazione; al contrario il metodo dispose eseguirà il rollback in caso di exception.
Questo commento è stato eliminato dall'autore.
RispondiElimina