Assuming you want this to happen on the client side, you can use IClientMessageInspector - if you want to implement this on the server side you can create an IDispatchMessageInspector .
By IClientMessageInspector , you check the result in the AfterReceiveReply event, and if you need to try again, you can initiate a retry ... when the call returns, you simply “overwrite” the result, which made you retry with a new one ... thus the calling call the operation does not notice anything (except that the call sometimes takes a little longer).
Although you should be careful in implementing the retry function (a possible problem with re-registration should be handled appriopriately).
For some sample code (without the attempt itself) see http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx
EDIT - according to the comments:
How to implement a repeat operation depends on several aspects.
Basically, you need to associate the call of the request message and the request messages with a playback message.
One way to do this is to implement IClientMessageFormatter.SerializeRequest OR IParameterInspector - this will allow you to record which method was called and which message object was created for it.
By IClientMessageInspector.BeforeSendRequest , you can assign a unique correlationState , which in turn allows you to associate the response message in your implementation with IClientMessageInspector.AfterReceiveReply , since the Framework will call your implementation with it as a second parameter.
From there, you can use Reflection to call back (all the necessary information is available, since you wrote down the type and method and parameters in your implementation of IClientMessageFormatter and / or IParameterInspector ) and overwrite the response message with a new answer.
Another (and possibly much simpler) option would be to implement a custom WCF client class and provide this to the caller ... this allows you to stay out of the mess of different inspectors, etc. and gives great control over any triggered operation.
EDIT 2 - according to comments:
When implementing IClientMessageInspector you will also need to implement IEndpointBehavior , which in turn has an ApplyClientBehavior method, which is called by WCF to add your IClientMessageInspector . In this method, you create an instance of your implementation that takes one argument in the constructor, which in turn is endpoint.Contract.ContractType or clientRuntime.ContractClientType . you store this type in the inspector ... for tips on how to do this, for example, http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/19500d14-78b7-4356-b817-fcc9abc2afcf/