3

我正在测试使用 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. 

该错误听起来像是找不到Web服务,但是如果我将URL剪切并粘贴到浏览器中,我会得到预期的XML文档...

这个网站上有另一个类似的帖子,但问题是base64问题,我只是返回txt所以我不认为这是一个类似的问题,即使错误消息是相似的。

4

1 回答 1

6

尝试将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 博客关于该论点的摘录refreshWSDL

为什么必须刷新 Web 服务元数据?

暂时备份一下,问题源于CF试图提供帮助。在对给定 Web 服务的第一次请求时,CF 会进行一些缓存以使未来的请求更快,而不是缓存 Web 服务方法的结果,而是缓存 CF 基于 Web 服务本身的描述使用的工件。

CF 使用在第一次调用时报告的 Web 服务描述 (WSDL) 来创建一个基于它的 java 代理/存根,然后它在将来从 CF 到该 Web 服务的调用中重用它。

如果/当 Web 服务元数据更改时,就会出现问题。CF 不会知道,并将继续使用旧的缓存代理/存根,如果它与 Web 服务返回的新 WSDL 不匹配,您的长时间运行的代码可能会失败。

所以我们需要一种方法来告诉 CF 刷新它的代理存根缓存。

这个新功能无疑是实现这一目标的最简单方法,但它不是唯一的方法。

于 2013-05-03T15:42:55.680 回答