Chiamare WCF con netmsmqbinding all'interno della transazione di arresto del transazione
-
19-09-2019 - |
Domanda
Ho un servizio di registrazione WCF che funziona su MSMQ. Gli elementi vengono registrati a un database SQL Server 2005. Ogni funzioni correttamente se utilizzata al di fuori di un transazione. Se utilizzata all'interno di un'istanza di transazione, la chiamata fa abortire sempre la transazione. Message = "La transazione è abortita".
Cosa devo fare per far funzionare questa chiamata all'interno di una transazione? È anche possibile. Ho letto che per una transazione client fluire su un limite di servizio, il legame deve supportare il flusso di transazione, il che limita immediatamente i legami solo a netnamedpipebinding, nettcpbinding, wshttpbinding, wsdualhttpbinding e wsfederationhttpbinding.
Soluzione
Non sono intimamente ben informato su MSMQ, ma c'è davvero una buona serie di post sul blog di Tom Hollander MSMQ, IIS e WCF: farli giocare bene - Nella parte 3 che è il link fornito a Tom parla di diventare transazionali.
MSMQ può essere transazionale - o no. E in WCF, è possibile decorare sia il contratto di servizio che i singoli contratti di funzionamento (metodi) con attributi relativi alle transazioni, come se consentire, non consentire o richiedere un contesto di transazione.
Per quanto ho capito, nella tua configurazione, non vuoi che la parte MSMQ sia transazionale, ma dovresti essere in grado di usarla anche se è presente una transazione ambientale. In questo caso, è necessario aggiungere TransactionFlow = "consentito" al contratto operativo come questo:
[ServiceContract]
public interface ILoggingService
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void LogData(......);
}
Questo dovrebbe farlo!
Marc
Altri suggerimenti
Sorry for the needless question...
I have solved my problem. I needed to place
[TransactionFlow(TransactionFlowOption.Allowed)]
on the operation in the service contract and then
[OperationBehavior(TransactionScopeRequired=true)]
on the implementation of the contract (the service itself).
Works a treat.