8

首先,我的问题和这个类似

但这有点不同。我们拥有的是一系列环境,具有相同的服务集。对于某些环境(本地环境),我们可以访问 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()

这给了我这个例外:

由于 EndpointDispatcher 的 ContractFilter 不匹配,接收方无法处理带有 Action ' http://tempuri.org/IMyService/IsHealthy '的消息。这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。

问题是,如果我将客户端直接设置为主机,它可以正常工作:client = suds.client.Client(host)

如您所见,我尝试克隆客户端,但有同样的例外。我什至试过这个:

    baseclient = suds.client.Client(host)

    client = baseclient.clone()

    client.options.location = otherhost
    ....

并得到了同样的例外。

任何人都可以帮助我吗?

4

3 回答 3

6
client.sd[0].service.setlocation(new_url)

...是“手动”方式,即。每个服务描述

client.set_option(new_url)

...根据作者的说法,也应该有效。

options 是一个包装/受保护的属性——直接编辑很可能会被忽略。

于 2013-02-13T20:53:06.633 回答
3

我懂了!。我什至不知道我是怎么想出来的,但是经过一点猜测和很大的运气,我最终得到了这个:

    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)的任何文档,但它有效,所以我发布它以防有人遇到同样的问题。

于 2010-05-17T20:46:01.833 回答
0

您可以通过指定location服务来做到这一点。假设您有一个Client名为 的对象client,您可以通过更新 中的 URL 来修改服务位置client.options.location

此外,您可以使用 WSDL 文件的本地副本作为url构建客户端时使用file://URL 的方案,例如file:///path/to/service.wsdl. 因此,这可能是您的另一种选择。当然,您还必须指定 ,location以便覆盖 WSDL 中的默认位置。

于 2010-05-14T19:25:08.877 回答