A problem with web services in practice is the lack of a middle ground between code-first and WSDL-first development. The former is typically misused to produce a bloated RPC interface. The latter increases the odds that you will think in terms of messages instead of methods (good!) but brings in the entire congitive load of WSDL (bad, when for many situations all you really want is Schema or less).
Craig Walls describes a third path: define the Schema, then use a tool to generate the WSDL. He also makes some good points about the meaning of "first" in phrases like "WSDL-first": An approach can be WDSL-first even if you generate the WSDL with a tool. I will definitely look at
DynamicWsdl11Definition the next time I need to define a service.