I servizi si basano sulla conversazione fra due endpoints. Conversazione significa scambio di messaggi. Lo scambio di messaggi, nel caso dei web services implementati oggi (con ASP.NET 1.x) può avvenire in due modi: one way e request/reply. In altre parole, mando il messaggio e non mi aspetto alcuna risposta, oppure mando la richiesta e mi arriva una risposta rispettivamente.
Indigo introduce un nuovo (concettualmente parlando non è nuovo, ma lo è l'implementazione) pattern di messaggistica: duplex. In pratica è un meccanismo di request/reply differito.
Immaginate di dover fare una richiesta ad un servizio che impiega parecchi minuti per essere eseguito (tanto da mandare in timeout la comunicazione). In questo caso potete definire un contratto per la richiesta (request) sul server ed uno per la risposta (reply) sul chiamante (client). Per correlarli (altrimenti sarebbero indipendenti) è necessario definire nel ServiceContract (ServiceContractAttribute) il contratto (del client) da richiamare quando la sua esecuzione ha terminato attraverso il parametro CallbackContract.