2013-05-03 40 views
1

我正在測試使用Web服務並且出現錯誤。使用ColdFusion webservice - 使用參數{}的Web服務操作無法找到

這裏是Web服務組件:

<cfcomponent > 
<cffunction name="listBooks" access="remote" returntype="string" output="no" > 

    <cfquery name="getBooks" datasource="cfbookclub" > 
     SELECT bookID, title, bookDescription, genre 
     FROM books 
     ORDER BY title desc 
    </cfquery> 

    <cfsavecontent variable="bookList" > 
     <books> 
      <cfoutput query="getBooks" > 
      <book id="#getBooks.bookID#" > 
       <title>#XMLFormat(getBooks.title)#</title> 
       <description>#XMLFormat(getBooks.bookDescription)#</description> 
       <genre>#XMLFormat(getBooks.genre)#</genre> 
      </book> 
      </cfoutput> 
     </books> 
    </cfsavecontent> 

    <cfreturn bookList > 
</cffunction> 

這裏是方頁面:

<cfinvoke 
webservice="http://127.0.0.1/books.cfc?wsdl" 
method="listBooks" 
returnvariable="rawXMLBookList" > 
</cfinvoke> 

似乎很簡單 - 我其實是想傳遞一個參數「流派「當我得到最初的錯誤時,

Web service parameter name category cannot be found in the provided parameters {genre}. 

所以我刪除了所有引用的論點,並仍然得到這個錯誤

Web service operation with parameters {} cannot be found. 

該錯誤使得它聽起來像網絡服務不能被發現,但是如果我剪切並粘貼URL到我的瀏覽器我得到的預期的XML文檔...

在這個網站上有這樣的另一篇文章,但問題是一個base64問題,我只是返回txt,所以我不認爲這是一個類似的問題,即使通過錯誤消息很相似。

回答

4

嘗試將refreshWSDL參數添加到您的<cfinvoke>調用中,看看是否有幫助。

<cfinvoke 
    webservice="http://127.0.0.1/books.cfc?wsdl" 
    method="listBooks" 
    refreshwsdl="yes" 
    returnvariable="rawXMLBookList"> 
</cfinvoke> 

設置refreshwsdl="yes"重載的WSDL文件並重新生成用於消費web服務的假象。

請注意,您不想爲所有請求保留此設置。您只需將其設置爲一個請求即可刷新工件。那麼你應該把它改回refreshwsdl="no"。直到你再次需要它。

這裏是Charlie Arehart's Blog有關refreshWSDL說法的摘錄:

你爲什麼要刷新的Web服務元數據?

只是爲了備份一下,問題源於CF的幫助嘗試。在給定Web服務的第一個請求上,CF會執行一些緩存,以使將來的請求更快,而不是緩存Web服務方法的結果,而是基於Web服務本身的描述緩存CF使用的工件。

CF使用第一次調用時報告的Web服務描述(WSDL)創建一個基於該代理/存根的代理/存根,然後重用它從CF到該Web服務的未來調用。

如果/當Web服務元數據更改時,會出現此問題。 CF不會知道並將繼續使用舊的緩存代理/存根,並且如果長時間運行的代碼與Web服務返回的新WSDL不匹配,則可能會失敗。

所以我們需要一種方法來告訴CF刷新它的代理存根的緩存。

這個新功能當然是最簡單的方法,但這不是唯一的方法。

+0

EXCELLENT ...非常感謝,做了這個伎倆。這些信息非常受歡迎 - 儘管從「優雅失敗」的角度來看,這聽起來像是你幾乎想要捕獲該錯誤,然後以refreshwsdl =「yes」的設置重試,但它的默認值爲refreshwsdl =「no 「......而不是在有人打電話來說他們有錯誤時將其重新編碼爲單次運行。 – jpmyob 2013-05-03 15:56:27

+0

這應該只在Web服務本身發生更改(很少在生產中)時才需要。例如,當您添加或刪除Web服務的參數或者如果您更改參數的類型。如果更改Web服務的返回類型。所有這些都是在開發過程中發生的,但是一旦Web服務正式投入使用,應該很少見。該函數中的代碼可以更改,而無需刷新WSDL。這有幫助嗎? – 2013-05-03 16:05:42

相關問題