2010-05-14 42 views
8

首先,我的問題是類似this one更改Web服務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.Client(主機)

正如你所看到的,我已經試過克隆客戶端,但具有相同的例外。我甚至試過這個:

baseclient = suds.client.Client(host) 

    client = baseclient.clone() 

    client.options.location = otherhost 
    .... 

並得到了同樣的例外。

任何人都可以幫到我嗎?

回答

0

您可以通過指定服務的location來完成此操作。假設您有一個名爲clientClient對象,您可以通過更新client.options.location中的URL來修改服務位置。

此外,通過使用URL的file://方案構建客戶端時,您可以使用WSDL文件的本地副本作爲url,例如, file:///path/to/service.wsdl。所以這可能是你的另一種選擇。當然,您還必須指定location,以便覆蓋WSDL中的默認位置。

+0

我已經嘗試了很多東西,但我不明白我在做什麼錯。 我將添加一些代碼,原來的問題,這將是巨大的,如果你可以檢查它 – patanpatan 2010-05-17 15:44:07

+0

我的問題是,服務提供商給您的文件。對於測試模式,您必須使用測試網址手動修改wsdl文件。我想在加載文件並更新服務地址位置之後動態地進行更改。我不認爲這是可能的。 – radtek 2015-12-15 16:43:30

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)的任何文檔,但它可以工作,所以我發佈它以防萬一有人遇到同樣的問題。

+0

啊! 它只是從文件中獲取網址。 client.wsdl.url設置被修改,但它繼續到原來的服務。 – patanpatan 2010-05-17 21:04:59

+0

它是如何工作的?如果不是,可能是'client.wsdl.url'和'client.options.location'的組合?這開始讓人覺得不舒服,也許SUDS郵件列表會更有幫助? – jathanism 2010-05-17 23:04:34