2010-02-14 48 views
12

我正在嘗試爲國家鐵路諮詢公司的SOAP服務(http://www.livedepartureboards.co.uk/ldbws/)實施客戶端。SOAP Action WSDL

我將WSDL(http://realtime.nationalrail.co.uk/ldbws/wsdl.aspx)粘貼到http://soapclient.com/soaptest.html中,但是我收到錯誤消息「無法處理沒有有效操作參數的請求,請提供有效的soap操作。該採取什麼行動?

感謝, 斯圖爾特

編輯:

我只是用soapclient.com作爲一個簡單的例子。在我的軟件中,我發送以下XML;我仍然認爲我錯過了一個動作。

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://thalesgroup.com/RTTI/2008-02-20/ldb/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ldbt2="http://thalesgroup.com/RTTI/2008-02-20/ldb/types" xmlns:ldbt="http://thalesgroup.com/RTTI/2007-10-10/ldb/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ct="http://thalesgroup.com/RTTI/2007-10-10/ldb/commontypes" > 
<SOAP-ENV:Body> 
    <ldbt2:GetDepartureBoardRequest xmlns:ldbt2="http://thalesgroup.com/RTTI/2008-02-20/ldb/" > 
    <ldbt2:numRows>5</ldbt2:numRows> 
    <ldbt2:crs>WAT</ldbt2:crs> 
    <ldbt2:filterCrs>GLD</ldbt2:filterCrs> 
    <ldbt2:filterType>to</ldbt2:filterType> 
    <ldbt2:timeOffset>0</ldbt2:timeOffset> 
    </ldbt2:GetDepartureBoardRequest> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+1

這很可能意味着soapclient.com不喜歡WSDL,因爲它自己的原因。 NRE web服務工作正常,但我自己也使用過。 – skaffman

+0

請參閱http://stackoverflow.com/questions/128263/how-do-you-determine-a-valid-soapaction – Jono

+0

簡而言之,搜索soapAction的WSDL。 查看http://stackoverflow.com/questions/128263/how-do-you-determine-a-valid-soapaction – Jono

回答

11

如果它再SOAP 1.1服務,您還需要包括SOAPAction HTTP頭字段:

http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528

+1

我得到那麼多...但我不能爲我的生活工作SOAPAction字段中應該包含什麼內容。 – Stewart

+1

它將與您的SOAP正文中的內容相同,即 GetDepartureBoardRequest或完全限定: http://thalesgroup.com/RTTI/2008-02-20/ldb/GetDepartureBoardRequest – mythz

+1

我試過了,但我得到「服務器無法識別HTTP頭SOAPAction的價值:GetDepartureBoardRequest」 – Stewart

4

試圖寫一個客戶端時,我所遇到一模一樣的問題使用Perl的國家鐵路SOAP服務。

的問題造成的,因爲我使用「SOAP ::精簡版」的Perl模塊,插入在SOAPAction頭一個「#」 ......

SOAPAction: "http://thalesgroup.com/RTTI/2008-02-20/ldb/#GetDepartureBoard" 

這不是由.NET正確解釋服務器。我從O'Reilly的Programming Web Services with SOAP的例3-19中發現了這一點。該解決方案在3-20節中給出,即您需要使用'on_action'方法明確指定頭部的格式。

print SOAP::Lite 
    -> uri('urn:Example1') 
    -> on_action(sub{sprintf '%s/%s', @_ }) 
    -> proxy('http://localhost:8080/helloworld/example1.asmx') 
    -> sayHello($name) 
    -> result . "\n\n"; 

我的猜測是soapclient.com在幕後使用SOAP :: Lite,因此在與National Rail交談時碰到同樣的問題。

解決方案是編寫自己的客戶端,以便您可以控制SOAPAction標頭的格式......但您可能已經這樣做了。

理查德

0

我剛剛花了一段時間試圖得到這個工作的有一個寫了Ruby gem訪問的API。你可以閱讀更多關於project page

在Ruby中這是工作代碼:

require 'savon' 
client = Savon::Client.new do 
    wsdl.document = "http://realtime.nationalrail.co.uk/LDBWS/wsdl.aspx" 
end 

response = client.request 'http://thalesgroup.com/RTTI/2012-01-13/ldb/GetDepartureBoard' do 

    namespaces = { 
    "xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/", 
    "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", 
    "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema" 
    } 

    soap.xml do |xml| 
    xml.soap(:Envelope, namespaces) do |xml| 
     xml.soap(:Header) do |xml| 
     xml.AccessToken do |xml| 
      xml.TokenValue('ENTER YOUR TOKEN HERE') 
     end 
     end 
     xml.soap(:Body) do |xml| 
     xml.GetDepartureBoardRequest(xmlns: "http://thalesgroup.com/RTTI/2012-01-13/ldb/types") do |xml| 
      xml.numRows(10) 
      xml.crs("BHM") 
      xml.filterCrs("BHM") 
      xml.filterType("to") 
     end 
     end 
    end 
    end 
end 
p response.body 

希望這是有幫助的人!

0

我們把Windows服務器上的Web服務放在一起,並試圖在Apache上連接PHP。我們得到了同樣的錯誤。這個問題最終成爲不同服務器上不同版本的Soap客戶端。在我們的例子中,在兩臺服務器上的選項中匹配SOAP版本解決了這個問題。

0

服務有4個操作: 1. GetServiceDetails 2. GetArrivalBoard 3. GetDepartureBoard 4。GetArrivalDepartureBoard

Implementation of web service

0

soapAction在SOAP 1.2請求缺少(和許多客戶不設置它,即使它在WSDL中指定),一些應用服務器(如JBoss的)推斷「真實」 soapAction from {xsd:import namespace}+{wsdl:operation name}。 因此,爲了使推斷 「真實」 soapAction符合預期soapAction,您可以設置預期的soapAction到{xsd:import namespace}+{wsdl:operation name}在您的WS定義(@WebMethod(action=...)爲Java EE)

EG。一個典型的Java EE的情況下,這有助於(不是斯圖爾特的情況下,國家鐵路WS擁有「的soapAction」集):

@WebMethod(action = "http://packagename.of.your.webservice.class.com/methodName")

如果你不能改變服務器,你將不得不強制客戶填寫soapAction

0

我已經解決了這個問題,在Java代碼中添加:

MimeHeaders headers = message.getMimeHeaders(); 
headers.addHeader("SOAPAction", endpointURL);