使用 ColdFusion 网络服务 - 无法找到带有参数 {} 的网络服务操作

jpm*_*yob 3 coldfusion web-services

我正在测试使用 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>
Run Code Online (Sandbox Code Playgroud)

这是消费页面:

<cfinvoke 
webservice="http://127.0.0.1/books.cfc?wsdl"
method="listBooks"
returnvariable="rawXMLBookList" >
</cfinvoke>
Run Code Online (Sandbox Code Playgroud)

看起来很简单 - 当我收到初始错误时,我实际上是在尝试传递一个参数“流派”,

Web service parameter name category cannot be found in the provided parameters {genre}.
Run Code Online (Sandbox Code Playgroud)

所以我删除了所有对参数的引用,仍然得到这个错误

Web service operation with parameters {} cannot be found. 
Run Code Online (Sandbox Code Playgroud)

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

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

Mig*_*l-F 6

尝试将refreshWSDL参数添加到您的<cfinvoke>调用中,看看是否有帮助。

<cfinvoke 
    webservice="http://127.0.0.1/books.cfc?wsdl"
    method="listBooks"
    refreshwsdl="yes"
    returnvariable="rawXMLBookList"> 
</cfinvoke>
Run Code Online (Sandbox Code Playgroud)

设置会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 刷新它的代理存根缓存。

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