A key impediment to the widespread adoption of web services is the relatively limited set of tools available to deal with Quality-of-Service (QoS) factors. QoS factors pose several difficult challenges in how they may be articulated. While the functional requirements of a service can be represented as predicates to be satisfied by the target system, QoS factors are effectively statements of objectives to be maximized or minimized. QoS requirements occur naturally as local specifications of preference. Dealing with QoS factors is therefore a multi-objective optimization problem. In effect, these objectives are never fully satisfied, but satisficed to varying degrees. In evaluating alternative design decisions, we need to trade-off varying degrees of satisfaction of potentially mutually contradictory non-functional requirements. One key contribution of this work is the use of the Hierarchical Constraint Logical Programming (HCLP) framework in dealing with functional requirements, business process rules and Quality of Service (QoS) factors. We show how functional requirements and business process rules can be defined as hard constraints, QoS factors can be formulated as soft constraints and how the machinery associated with constraint hierarchies can be used to evaluate the alternative trade-offs involved in seeking to satisfy a set of QoS factors that might pull in different directions. We apply also this approach to the problem of reasoning about web service selection and composition, and establish that significant value can be derived from such an exercise.