Me llama la atencion ésto:
Cita: <WebMethod()> Public Function Hola()
Try
CN.Open()
DR = Cmd.ExecuteReader
While DR.Read
Return "Nombre: " & DR.Item("nombre")
Te regresa un valor porque le estás indicando que el primer valor que encuentre lo devuelva.
Por el codigo que veo mas bien tendrías que guardar todos los datos en el array que declaraste arriba y ése es el que tienes que devolver.
Por otro lado, te cuidado porque estás regresando un valor antes de que cierres la conexion y tu datareader
Cita: Return "Nombre: " & DR.Item("nombre")
End While
Catch Ex As Exception
Return Ex.Message
Finally
DR.Close()
CN.Close()
Saludos