2017-07-16 135 views
0

我有幾個WSDL文件並使用gSOAP來創建C++代碼。gSOAP - SOAP-Action Header未設置

生成代碼中使用下列命令:

\path\to\wsdl2h -I \path\to\import\dir -j -N Service1Prefix -n Namespace1Prefix -o \path\to\output\header\dir\header1.h -q CPPNamespace1 -t \path\to\typemap.dat .\path\to\wsdl1.wsdl 

等了剩餘的WSDL文件。 在gsoap文檔中,我讀到了需要一個空的env.h文件來處理序列化和錯誤處理。所以我爲此創建了一個空文件。

此後,我生成的C++代碼,每個與soap2cpp工具的WSDL文件:

\path\to\soap2cpp -1 -C -L -a -A -b -d \path\to\output\dir -i -j -I \path\to\import\dir -n -r -w -x \path\to\header\dir\header1.h 

而且env.h

\path\to\soap2cpp -1 -C -L -b -d \path\to\output\dir -j -I \path\to\import\dir -penv -r -w -x \path\to\env.h 

一切工作和我的C++代碼。

我把它放到我的代碼中,嘗試了一個方法,但提示出錯。

Error: WSWS3147E: Error: no SOAPAction header!

我嘗試了一些擺弄wsdl2h和soap2cpp的參數,但沒有得到滿意的結果。 當我刪除前綴的參數時,SOAPAction頭部被設置,但當響應包含一些名稱相同但內容不同的對象時,我會遇到問題。

一些搜索沒有爲我提供工作解決方案。 以前有人會遇到這個問題,可以提供一些幫助嗎?

回答

0

可能是WSDL沒有在wsdl:binding/wsdl:operation/soap:operation/@ soapAction屬性中定義SOAP Action標頭,儘管這不太可能。但是,如果情況如此,或者WSDL中沒有正確指定soapAction,並且您知道SOAP Action標頭應該是什麼,那麼可以在調用服務時手動設置SOAP Action標頭,如下所示:

// create a service proxy object 
SomeProxy proxy; 
// invoke the service at an endpoint URL and SOAP Action, pass parameters: 
if (proxy.someMethod("endpoint URL", "soap action", ...) == SOAP_OK) 
    ... // got the results! 

這將SOAP Action HTTP標頭設置爲作爲第二個參數提供的字符串。您可以使用NULL作爲端點和/或操作字符串,以使調用使用WSDL定義的端點和操作。

PS#1。僅使用soapcpp2選項-j(首選)或-i,但不要同時使用兩者。

PS#2。爲什麼不在所有的WSDLs上運行wsdl2h?這最終節省了大量生成的代碼。當服務組合在一個大的.h文件中時,服務代理類是通過soapcpp2爲WSDL中的服務單獨生成的。這樣你也可以確定SOAP Headers和SOAP Faults是開箱即用的。說明:env.h應定義從單獨生成的.h文件中提取的所有SOAP Headers和SOAP Fault詳細信息結構,這些結構可能很難完成。

+0

每個WSDL中的每個方法都包含一個soapAction屬性。使用了 – MBU

+0

gSOAP版本2.8.47。我會試試2.8.49。 將所有WSDL合併爲一個大頭文件給我們帶來了問題。 想象一下你的位置。 在一個WSDL中,位置包含街道地址,城市等。位於第二個WSDL中的 位置包含移動對象的緯度,經度和時間戳。 wsdl2h只保留此位置對象的第一次出現。 – MBU

+0

您是說您的WSDL沒有唯一的名稱空間,導致命名衝突?這是一個非常糟糕的設計。這就是命名空間的用途。很高興聽到有辦法解決這個問題。 –