2010-05-14 11 views
8

Prima di tutto, la mia domanda è simile a this oneCambia servizio web url per un cliente schiuma sul runtime (mantenendo il WSDL)

Ma è un po 'diverso. Quello che abbiamo è una serie di ambienti, con lo stesso insieme di servizi. Per alcuni ambienti (quelli locali) possiamo accedere a wsdl e quindi generare il client suds. Per l'ambiente esterno, non è possibile accedere a wsdl. Ma essendo lo stesso, speravo di poter modificare solo l'URL senza rigenerare il client. Ho provato a clonare il client, ma non funziona.


Edit: Codice aggiungendo:

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() 

che mi dà questa eccezione:

il messaggio con azione 'http://tempuri.org/IMyService/IsHealthy' non possono essere trattati presso il ricevitore, a causa di una mancata corrispondenza ContractFilter al EndpointDispatcher. Ciò può essere dovuto a una mancata corrispondenza contrattuale (azioni non corrispondenti tra il mittente e il destinatario) o una mancata corrispondenza tra il mittente e il destinatario. Verifica che mittente e destinatario abbiano lo stesso contratto e lo stesso legame (inclusi i requisiti di sicurezza, ad esempio Messaggio, Trasporto, Nessuno).

Il fatto è che, se ho impostato il cliente direttamente all'host, funziona benissimo: client = suds.client.Client (host)

Come potete vedere, ho provato clonazione del cliente, ma con la stessa eccezione. Ho anche provato questo:

baseclient = suds.client.Client(host) 

    client = baseclient.clone() 

    client.options.location = otherhost 
    .... 

E ha ottenuto la stessa eccezione.

Chiunque può aiutarmi?

risposta

0

Potrebbe essere possibile farlo specificando lo location del servizio. Supponendo di avere un oggetto Client chiamato client, è possibile modificare il percorso del servizio aggiornando l'URL in client.options.location.

Inoltre si sono in grado di utilizzare una copia locale di un file WSDL come il url quando si costruisce il client utilizzando uno schema file:// per l'URL, ad esempio, file:///path/to/service.wsdl. Quindi questa potrebbe essere un'altra opzione per te. Naturalmente dovresti anche specificare lo location in modo che la posizione predefinita all'interno del WSDL sia sovrascritta.

+0

Ho provato un sacco di cose ma non riesco a capire cosa sto facendo male. Aggiungo un po 'di codice alla domanda originale, Sarebbe bello se potesse controllarlo – patanpatan

+0

Il mio problema è che il fornitore di servizi ti dà un file. Per la modalità test, devi modificare manualmente il file wsdl con l'url test. Volevo apportare la modifica in modo dinamico dopo aver caricato il file e aggiornato il percorso dell'indirizzo del servizio. Non penso sia possibile. – radtek

3

L'ho capito !. Io non so nemmeno come ho capito, ma con un po 'di indovinare e una gran parte della fortuna ho finito con questo:

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() 

e funziona! Non riesco a trovare alcuna documentazione su tale proprietà (client.wsdl.url), ma funziona, quindi la pubblichiamo nel caso qualcuno abbia lo stesso problema.

+0

argh! Stava solo ricevendo l'url dal file. L'impostazione client.wsdl.url è stata modificata, ma continua ad andare al servizio originale. – patanpatan

+0

Quindi funziona? In caso contrario, forse una combinazione di 'client.wsdl.url' e' client.options.location'? Questo comincia a sentirsi hacky, forse la mailing list SUDS sarebbe più utile? – jathanism