views:

275

answers:

1

I have a WCF service being called as part of a transaction.

If the service is called twice (often happening during debugging) I want a FaultException to be thrown by the service but the overall transaction must succeed.

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

Since I'm throwing a FaultException the transaction will vote to abort right?

I'm considering doing this (setting the transaction complete - and then throwing the fault) - but i don't even know if that will work. It also has some complications that I don't want to have to worry about.

[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;
   }
}

An obvious solution is to return a message with a Success parameter - which is what I originally did - but that's bad design because ultimately it is a Fault and deserves to have an exception.

Or is the solution as simple as having my client catch the Fault and continue with the transaction. I'm concerned that voting has already taken place through.

What's the best way to allow a WCF service to throw a fault but still allow the transaction to succeed?

+1  A: 

You could try wraping the call to the WCF service in a Transaction Scope with Transaction Scope option Supress (That is a sub transaction scope to the one you have). This will stop an exception from this part of the code from affecting the ambient transaction. As long as you handle the exception before you exit the inner/sub transaction scope you should be OK.

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

Shiraz Bhaiji
thats probably what i'm looking for. am i right in assuming that an exception will auto-vote the overall transaction to fail?
Simon_Weaver
Not sure if it will automatically auto-vote. But what normally happens when you get an exception is that the code exits at that point, and therefore does not hit the scope.complete and then the transaction will fail.
Shiraz Bhaiji