Quando implementiamo un web service in ASP.NET il contratto è il documento WSDL generato quando richiamiamo la pagine asmx con l'estensione WSDL (mioServizio.asmx?wsdl). Il WSDL generato spesso non è sufficientemente preciso e quindi si dovrebbe partire dal WSDL per poi generare il codice (contract-first).
Se analizziamo bene, ci rendiamo conto che il WSDL non è sempre sufficiente per descrivere in toto il contratto di un servizio. Fondamentalmente dipende dal message pattern. In ASP.NET sono disponibili due message patterns: one way (invio il messaggio SOAP al servizio e non ho alcuna risposta) e request/reply (invio e ricevo una risposta SOAP). Se usassimo il pattern duplex, cioè invio un messaggio SOAP di richiesta e quando sarà pronta (magari dopo ore) riceverò una risposta, allora servono due WSDL. Uno per l'invio ed uno per la risposta (nota: questo concetto fa decadere anche quello di client/server in quanto i ruoli si invertono nel tempo - chi è client prima diventa server dopo).