Измените URL веб-сервиса для клиента пены на времени выполнения (хранение wsdl)

В первую очередь, мой вопрос подобен этому

Но это немного отличается. То, что мы имеем, является серией сред с тем же набором сервисов. Для некоторых сред (локальные) мы можем получить доступ к 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
    ....

И получил то же исключение.

Кто-либо может помочь мне?

8
задан Community 23 May 2017 в 11:46
поделиться

2 ответа

Я понял !. Я даже не знаю, как я это понял, но после некоторых догадок и большой удачи я получил следующее:

    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), но он работает, поэтому я публикую его на случай, если у кого-то возникнет такая же проблема.

3
ответ дан 5 December 2019 в 21:17
поделиться

Вы можете сделать это, указав расположение службы. Предполагая, что у вас есть объект Client с именем client , вы можете изменить местоположение службы, обновив URL-адрес в client.options.location .

Кроме того, вы можете использовать локальную копию файла WSDL в качестве url при создании клиента с использованием схемы file: // для URL, например файл: ///path/to/service.wsdl . Так что это может быть еще один вариант для вас. Конечно, вам также придется указать местоположение , чтобы переопределить местоположение по умолчанию из WSDL.

0
ответ дан 5 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: