开发者

Change web service url for a suds client on runtime (keeping the wsdl)

开发者 https://www.devze.com 2022-12-30 13:13 出处:网络
First of all, my question is similar to this one But it\'s a little bit different. What we have is a series of environments, with the same set of services.

First of all, my question is similar to this one

But it's a little bit different. What we have is a series of environments, with the same set of services. For some environments (the local ones) we can get access to the wsdl, and thus generating the suds client. For external environment, we cannot access the wsdl. But being the same, I was hoping I can change just the URL without regenerating the client. I've tried cloning the client, but it doesn't work.


Edit: adding code:

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

That gives me this exception:

The message with Action 'http://tempuri.org/IMyService/IsHealthy' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

The thing is, if I set the client directly to the host, it works fine: client = suds.client.Client(host)

As you can see, I've tried cloning the client, but with the same exception. I even tried this:

    baseclient = suds.client.Client(host)

    client = baseclient.clone()

    client.options.location = otherhost
    ....

And got the same exception.

Anyone can help me?


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

...is the "manual" way, ie. per service-description.

client.set_option(new_url)

...should also work, per the author.

options is a wrapped/protected attr -- direct edits may very well be ignored.


I've got it!. I don't even know how I've figured it out, but with a little of guessing and a much of luck I ended up with this:

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

And it works! I can't find any documentation about that property (client.wsdl.url), but it works, so I post it in case someone have the same problem.


You might be able to do that by specifying the location of the service. Assuming you have a Client object called client, you can modify the service location by updating the URL in client.options.location.

Additionally you are able to use a local copy of a WSDL file as the url when constructing the client by using a file:// scheme for the URL, e.g. file:///path/to/service.wsdl. So this could be another option for you. Of course you would also have to specify the location so that the default location from within the WSDL is overridden.

0

精彩评论

暂无评论...
验证码 换一张
取 消