2010-05-14 18 views
8

En primer lugar, mi pregunta es similar a this onecambiar la URL del servicio web para un cliente espuma en tiempo de ejecución (manteniendo el WSDL)

Pero es un poco diferente. Lo que tenemos es una serie de entornos, con el mismo conjunto de servicios. Para algunos entornos (los locales), podemos conseguir el acceso al WSDL, y generando así el cliente espuma. Para un entorno externo, no podemos acceder al wsdl. Pero al ser el mismo, esperaba poder cambiar solo la URL sin regenerar el cliente. He intentado clonar el cliente, pero no funciona.


Editar: Código de la adición:

host='http://.../MyService.svc' 
    wsdl_file = 'file://..../wsdl/MyService.wsdl' 

    client = suds.client.Client(wsdl_file, location=host, cache=None) 

    #client = baseclient.clone() 

    #client.options.location = otherhost 

    client.set_options(port='BasicHttpBinding_IMyService') 

    result = client.service.IsHealthy() 

que me da esta excepción:

El mensaje con Acción 'http://tempuri.org/IMyService/IsHealthy' no pueden ser procesados ​​en el receptor, debido a una falta de coincidencia ContractFilter en el EndpointDispatcher. Esto puede ser debido a un desajuste o bien contrato (acciones que no coinciden entre emisor y receptor) o una falta de coincidencia de unión/de seguridad entre el emisor y el receptor. Verifique que el remitente y el receptor tengan el mismo contrato y el mismo enlace (incluidos los requisitos de seguridad, por ejemplo, Mensaje, Transporte, Ninguno).

La cosa es, si fijo el cliente directamente a la máquina, que funciona bien: cliente = suds.client.Client (host)

Como se puede ver, he intentado clonar el cliente, pero con la misma excepción Incluso he intentado esto:

baseclient = suds.client.Client(host) 

    client = baseclient.clone() 

    client.options.location = otherhost 
    .... 

Y tengo la misma excepción.

¿Alguien me puede ayudar?

Respuesta

0

Usted puede ser capaz de hacerlo especificando el location del servicio. Asumiendo que tiene un objeto llamado Clientclient, puede modificar la ubicación del servicio mediante la actualización de la dirección URL en client.options.location.

Además, puede utilizar una copia local de un archivo WSDL como url al construir el cliente utilizando un esquema file:// para la URL, p. file:///path/to/service.wsdl. Entonces esta podría ser otra opción para ti. Por supuesto, también tendría que especificar el location de manera que se anula la ubicación predeterminada dentro del WSDL.

+0

He intentado muchas cosas pero no puedo entender lo que estoy haciendo mal. Voy a agregar un código a la pregunta original, sería genial si pudiera verificarlo – patanpatan

+0

Mi problema es que el proveedor del servicio le da un archivo. Para el modo de prueba, debe modificar el archivo wsdl manualmente con la url de prueba. Quería hacer el cambio dinámicamente después de cargar el archivo y actualizar la ubicación de la dirección del servicio. No creo que eso sea posible. – radtek

3

lo tengo !. Ni siquiera sé cómo he averiguado, pero con un poco de adivinar y una gran parte de la suerte terminé con esto:

wsdl_file = 'file://...../MyService.wsdl' 

    client = suds.client.Client(wsdl_file) 
    client.wsdl.url = host #this line did the trick 

    client.set_options(port='BasicHttpBinding_IMyService') 

    result = client.service.IsHealthy() 

y funciona! no puedo encontrar ninguna documentación acerca de este inmueble (client.wsdl.url), pero funciona, así que puesto que en caso de que alguien tiene el mismo problema.

+0

argh! Acaba de obtener la url del archivo. La configuración client.wsdl.url se modifica, pero continúa en el servicio original. – patanpatan

+0

Entonces, ¿funciona? Si no, ¿quizás una combinación de 'client.wsdl.url' y' client.options.location'? Esto empieza a parecer raro, ¿quizás la lista de correo de SUDS sería más útil? – jathanism

Cuestiones relacionadas