我的問題類似於以下文章中的問題:Consume XML SOAP Webservice in Java。基本上我的問題是用wsimport生成客戶端代碼並不真正失敗,但會生成警告「[警告]端口」reqReplyEndpoint「不包含任何可用的操作」。這導致不完整的代碼生成,例如我在生成的請求/請求類中缺少參數。這是一個使用WCF消息路由服務的IIS上託管的WCF服務。 IIS將所有服務請求路由到端點。我無法控制這個服務,我只需要對它進行瀏覽。任何想法如何在沒有工作的情況下實現這一點,例如aksappy提到的方法?任何框架,樣本是否可用?對於上面提到的在運行時使用模式驗證器來檢查WSDL的解決方案,然後基於它們具有單獨的解析機制?Cosuming XML SOAP Webservice without「wsimport」
回答
剛剛檢查了您的包裹。
您的WSDL包含兩個服務,一個名爲reqReplyEndpoint,另一個名爲BasicHttpBinding_TestTableService。我敢肯定,你想用BasicHttpBinding_TestTableService繼續,因爲另一箇中有空的定義(沒有操作等規定,請參閱xppservice-wsdl0.xml)
因此: "[WARNING] Port "reqReplyEndpoint" does not contain any usable operations"
不是空的理由TestTableServiceGetListRequest。這是兩個獨立的wsdl:服務之間沒有直接關係。由於名爲「reqReplyEndpoint」的綁定指向一個名爲「IRequestReplyRouter」的porttype,其中有空的定義(只比較內容xppservice-wsdl0.xml和xppservice-wsdl1.xml),所以會引發此警告。 這個原因必須在你的代碼的某個地方,我不是C#WSDL專家(但是在WSDL/Web服務中有相當豐富的經驗)。
下一頁: 您的WSDL包含名稱三種操作:根據的soapUI createMember deleteMember 的GetList
的WSDL型結果(SOAP ENV)進行的GetList:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dat="http://schemas.microsoft.com/dynamics/2010/01/datacontracts" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:ser="http://ax.bernina.com/01/services">
<soapenv:Header>
<dat:CallContext>
<!--Optional:-->
<dat:Company>?</dat:Company>
<!--Optional:-->
<dat:Language>?</dat:Language>
<!--Optional:-->
<dat:LogonAsUser>?</dat:LogonAsUser>
<!--Optional:-->
<dat:MessageId>?</dat:MessageId>
<!--Optional:-->
<dat:PropertyBag>
<!--Zero or more repetitions:-->
<arr:KeyValueOfstringstring>
<arr:Key>?</arr:Key>
<arr:Value>?</arr:Value>
</arr:KeyValueOfstringstring>
</dat:PropertyBag>
</dat:CallContext>
</soapenv:Header>
<soapenv:Body>
<ser:TestTableServiceGetListRequest/>
</soapenv:Body>
</soapenv:Envelope>
你看, ser:TestTableServiceGetListRequest爲空,因爲底層基本xsd(xppservice-xsd3.xml)包含空白定義:
<xs:element name="TestTableServiceGetListRequest">
<xs:complexType>
<xs:sequence/>
</xs:complexType>
</xs:element>
如果您希望TestTableServiceGetListRequest中有更多參數,那麼如果缺少某些內容(註釋或類似內容),您應該檢查相應的源代碼(負責WSDL結果 - 我不是在討論wsimport結果)。
另外:我會建議,而不是先設計代碼優先設計(首先創建WSDL,然後生成代碼),因爲如您所見,代碼的結果可能不像預期的那樣搜索代碼中的根本原因可能很困難。
編輯1 關於問題1從評論:
如果你想從肥皂CallContext中移動:頭到SOAP:身體,之後需要在WSDL(xppservice-WSDL改變。XML):
前:
<wsdl:operation name="getList">
<soap:operation soapAction="http://ax.bernina.com/01/services/TestTableService/getList" style="document"/>
<wsdl:input name="TestTableServiceGetListRequest">
<soap:header message="i1:TestTableServiceGetListRequest_Headers" part="context" use="literal"/>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="TestTableServiceGetListResponse">
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="AifFaultFault">
<soap:fault name="AifFaultFault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
後:
<wsdl:operation name="getList">
<soap:operation soapAction="http://ax.bernina.com/01/services/TestTableService/getList" style="document"/>
<wsdl:input name="TestTableServiceGetListRequest">
<soap:body message="i1:TestTableServiceGetListRequest_Headers" part="context" use="literal"/>
</wsdl:input>
<wsdl:output name="TestTableServiceGetListResponse">
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="AifFaultFault">
<soap:fault name="AifFaultFault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
如果您希望在TestTableServiceGetList-Request中定義一些定義,則需要在代碼中修復它,該代碼負責服務器端服務和WSDL。之後,您可以繼續進行客戶端。 –
如果服務器端已完成(預期參數存在於WSDL + XSD中)並且最糟糕的情況出現了,並且您不得不在客戶端上取得進展,那麼您仍然可以繞過所有wsimport wsdl生成步驟,並執行以下相當粗魯的解決方法:使用soapUI生成肥皂信封(就像我上面做的那樣),並通過一個簡單的http-client(例如apache httpclient - 即使從命令行卷曲將執行它)發送生成的soap-envelope作爲http-payload到服務器。是的,這跳過了web服務技術(契約,類型,...)的所有優點,但正如我所說:如果最糟糕的是最壞的.. –
非常感謝你這個很好的答案。你的解釋對我來說非常詳細和明確。我還有一些問題,並希望如果你能幫助我: – tinu73
- 1. Cosuming java webservice json into Angular4
- 2. java soap webservice xml to object
- 3. AJAX AutoCompleteextender without webservice
- 4. php soap call without xsi:type
- 5. wsimport在SOAP 1.1中使用SOAP 1.2 wsdl
- 6. c#rest webservice without IIS
- 7. 使用wsimport中創建的webservice JAX-WS
- 8. 使用Django SOAP SOAP webservice
- 9. soap webservice with ASIHTTPREQUEST
- 10. SOAP webservice
- 11. wget,webservice和SOAP
- 12. 將soap/xml中的Soap Request Header從C#中的asmx webservice更改爲soap/xml#
- 13. 調用soap webservice在android中準備xml
- 14. 將JSON轉換爲XML用於SOAP Webservice
- 15. 爪哇 - JAX-WS的WebService(SOAP)
- 16. Rest API或Soap webservice
- 17. 解組爲SOAP中的泛型類型xml中的soap webservice anytype
- 18. SOAP WebService ...如何?
- 19. 訪問SOAP WebService
- 20. Blackberry SOAP Webservice
- 21. SOAP WebService objective-c
- 22. 日期SOAP webservice
- 23. Animate Fragment without xml
- 24. 缺少參數1當Cosuming使用CURL的SOAP服務php
- 25. 消費與JavaScript的SOAP WebService
- 26. Php,Soap和ASMX WebService
- 27. Android和SOAP的Webservice
- 28. PHP上的WSDL-SOAP Webservice
- 29. 在Java中獲取引用SOAP SOAP webservice
- 30. maven tomcat部署soap webservice錯誤
是WSDL可用呢?你有沒有嘗試將它導入到另一個工具如soapUI來檢查其完整性? –
是WSDL可用。我可以使用基本的C#控制檯應用程序並添加一個服務引用。使用SoapUI:加載WSDL時出錯(org.apache.xmlbeans.XmlException:錯誤:引用未定義的實體raquo)。 WSDL正在從不同名稱空間導入模式,既有簡單類型也有複雜類型 – tinu73
嗯,如果soapUI在導入期間抱怨WSDL,我不認爲WSDL是正確的。如果可能的話,您可以在這裏發佈WSDL內容(包括引用的XSD),我們可以修復WSDL。之後,wsimport也應該可以工作。 –