2016-01-07 60 views
0

我的問題類似於以下文章中的問題:Consume XML SOAP Webservice in Java。基本上我的問題是用wsimport生成客戶端代碼並不真正失敗,但會生成警告「[警告]端口」reqReplyEndpoint「不包含任何可用的操作」。這導致不完整的代碼生成,例如我在生成的請求/請求類中缺少參數。這是一個使用WCF消息路由服務的IIS上託管的WCF服務。 IIS將所有服務請求路由到端點。我無法控制這個服務,我只需要對它進行瀏覽。任何想法如何在沒有工作的情況下實現這一點,例如aksappy提到的方法?任何框架,樣本是否可用?對於上面提到的在運行時使用模式驗證器來檢查WSDL的解決方案,然後基於它們具有單獨的解析機制?Cosuming XML SOAP Webservice without「wsimport」

+0

是WSDL可用呢?你有沒有嘗試將它導入到另一個工具如soapUI來檢查其完整性? –

+0

是WSDL可用。我可以使用基本的C#控制檯應用程序並添加一個服務引用。使用SoapUI:加載WSDL時出錯(org.apache.xmlbeans.XmlException:錯誤:引用未定義的實體raquo)。 WSDL正在從不同名稱空間導入模式,既有簡單類型也有複雜類型 – tinu73

+0

嗯,如果soapUI在導入期間抱怨WSDL,我不認爲WSDL是正確的。如果可能的話,您可以在這裏發佈WSDL內容(包括引用的XSD),我們可以修復WSDL。之後,wsimport也應該可以工作。 –

回答

0

剛剛檢查了您的包裹。

您的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> 
+0

如果您希望在TestTableServiceGetList-Request中定義一些定義,則需要在代碼中修復它,該代碼負責服務器端服務和WSDL。之後,您可以繼續進行客戶端。 –

+0

如果服務器端已完成(預期參數存在於WSDL + XSD中)並且最糟糕的情況出現了,並且您不得不在客戶端上取得進展,那麼您仍然可以繞過所有wsimport wsdl生成步驟,並執行以下相當粗魯的解決方法:使用soapUI生成肥皂信封(就像我上面做的那樣),並通過一個簡單的http-client(例如apache httpclient - 即使從命令行卷曲將執行它)發送生成的soap-envelope作爲http-payload到服務器。是的,這跳過了web服務技術(契約,類型,...)的所有優點,但正如我所說:如果最糟糕的是最壞的.. –

+0

非常感謝你這個很好的答案。你的解釋對我來說非常詳細和明確。我還有一些問題,並希望如果你能幫助我: – tinu73