Изменение URL-адреса веб-службы для клиента suds во время выполнения (с сохранением wsdl) - PullRequest
8 голосов
/ 14 мая 2010

Прежде всего, мой вопрос похож на этот

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

Дело в том, что если я устанавливаю клиента непосредственно на хост, он работает нормально: client = suds.client.Client (host)

Как видите, я пытался клонировать клиента, но с тем же исключением. Я даже попробовал это:

    baseclient = suds.client.Client(host)

    client = baseclient.clone()

    client.options.location = otherhost
    ....

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

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

Ответы [ 3 ]

4 голосов
/ 14 февраля 2013
client.sd[0].service.setlocation(new_url)

... это "ручной" способ, т.е. за описание услуги .

client.set_option(new_url)

... также должно работать, за автора .

options упакованный / защищенный атрибут - прямое редактирование вполне может быть проигнорировано.

3 голосов
/ 18 мая 2010

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

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

0 голосов
/ 14 мая 2010

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

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

...