Pregunta

Tengo un servicio de WCF ser llamado como parte de una transacción.

Si el servicio se llama dos veces (a menudo ocurre durante la depuración) Quiero un FaultException a ser lanzada por el servicio, pero la transacción global debe tener éxito .

 throw new FaultException("Duplicate action not allowed for " + 
                          msgIn.ActionType, new FaultCode("DUPE_ACTION"));

Desde que estoy lanzando una FaultException la transacción va a votar a la derecha de aborto?

Estoy pensando en hacer esto (ajuste de la transacción completa - y luego tirar el fallo) - pero yo ni siquiera sé si ese trabajo. También tiene algunas complicaciones que no quieren tener de qué preocuparse.

[OperationBehavior(TransactionScopeRequired = true,
                   TransactionAutoComplete = false)]
public void MyMethod(...)
{
   try
   {
      OperationContext.Current.SetTransactionComplete( );
      throw new FaultException("Duplicate action not allowed for " + 
                          msgIn.ActionType, new FaultCode("DUPE_ACTION"));
   }
   catch
   {
      /* Do some error handling then */
      throw;
   }
}

Una solución obvia es devolver un mensaje con un parámetro Success - que es lo que hice originalmente - pero eso es un mal diseño, porque en última instancia, se trata de un fallo y merece tener una excepción.

O es la solución tan simple como tener mi cliente captura el fallo y continuar con la transacción. Me preocupa que la votación ya ha tenido lugar a través.

¿Cuál es la mejor manera de permitir un servicio WCF para lanzar una avería, pero todavía permiten la operación tenga éxito?

¿Fue útil?

Solución

Usted podría intentar wraping la llamada al servicio de WCF en un ámbito de transacción con la opción de ámbito de transacción Supress (Ese es un ámbito sub transacción a la que tienes). Esto detendrá una excepción a esta parte del código de afectar a la transacción ambiente. Mientras controla la excepción antes de salir del ámbito de transacción / sub interno que debe estar bien.

http://msdn.microsoft.com/en -us / biblioteca / system.transactions.transactionscopeoption.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top