В первую очередь, мой вопрос подобен этому
Но это немного отличается. То, что мы имеем, является серией сред с тем же набором сервисов. Для некоторых сред (локальные) мы можем получить доступ к wsdl и таким образом генерацию клиента пены. Для внешней среды мы не можем получить доступ к wsdl. Но будучи тем же, я надеялся, что могу изменить просто URL, не повторно создавая клиент. Я попытался клонировать клиент, но это не работает.
Править: добавление кода:
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()
Это дает мне это исключение:
Сообщение с Действием 'http://tempuri.org/IMyService/IsHealthy' не может быть обработано в получателе, из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть из-за любого несоответствием контракта (Действия, которым не соответствуют, между отправителем и получателем) или несоответствием привязки/безопасности между отправителем и получателем. Проверьте, что отправитель и получатель имеют тот же контракт и ту же привязку (включая требования к защите, например, сообщение, Транспорт, Ни один).
Вещь, если я установил клиент непосредственно на хост, она хорошо работает: клиент = suds.client. Клиент (хост)
Как Вы видите, я попытался клонировать клиент, но за тем же исключением. Я даже попробовал это:
baseclient = suds.client.Client(host)
client = baseclient.clone()
client.options.location = otherhost
....
И получил то же исключение.
Кто-либо может помочь мне?
Я понял !. Я даже не знаю, как я это понял, но после некоторых догадок и большой удачи я получил следующее:
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()
И это работает! Я не могу найти никакой документации по этому свойству (client.wsdl.url), но он работает, поэтому я публикую его на случай, если у кого-то возникнет такая же проблема.
Вы можете сделать это, указав расположение
службы. Предполагая, что у вас есть объект Client
с именем client
, вы можете изменить местоположение службы, обновив URL-адрес в client.options.location
.
Кроме того, вы можете использовать локальную копию файла WSDL в качестве url
при создании клиента с использованием схемы file: //
для URL, например файл: ///path/to/service.wsdl
. Так что это может быть еще один вариант для вас. Конечно, вам также придется указать местоположение
, чтобы переопределить местоположение по умолчанию из WSDL.