调用 Webservice 时找不到方法 API

Method cannot be found when invoking Webservice API

在为 GetTablesBin 方法调用 Webservice API 时,出现错误 Web service operation GetTablesBin with parameters cannot be found.

Web服务调用代码

<cfinvoke  
    webservice="http://www.argusmedia.com/ArgusWSVSTO/ArgusOnline.asmx?wsdl"
    method="GetTablesBin" 
    returnvariable="binResponse"> 
    <cfinvokeargument name="authToken" value="#AuthToken#"/>
    <cfinvokeargument name="tableNames" value="#tablename#"/>
 </cfinvoke>

我可以使用 SOAPUI 客户端看到方法 运行 很好。

在进一步挖掘时,发现 Coldfusion 存根文件夹中也缺少方法 class。

任何指示真的很有帮助吗?

Web service operation GetTablesBin with parameters {...} cannot be found.

注意到上面写着 "with parameters" 了吗?细微差别,但它意味着 a) 该方法根本不存在或 b) 它 确实 存在,但接收到错误的参数数量或类型。在这种情况下,问题是 "b)"。

解决 Web 服务问题时,创建 Web 服务的实例,然后转储该对象以查看该方法需要哪些参数通常很有帮助。根据 CF11,"GetTablesBin" 方法需要两个参数:StringArrayOfString。但是,当前代码传入两个 String。因此错误。

代码:

<!--- Add {refreshWSDL=false} if needed --->
<cfset ws = createObject("webservice"
              , "http://www.argusmedia.com/ArgusWSVSTO/ArgusOnline.asmx?wsdl")>
<cfset writeDump(ws)>

转储:

一个ArrayOfString是一个slightly strange beast:

... there is no direct mapping of ArrayOfString. So it is essentially treated as a structure, just like any other complex type. If you look at the wsdl, ArrayOfString contains a single key named string, whose value is an array of type="s:string":

要解决该错误,只需创建一个具有正确键的结构并将其传递到 cfinvoke 调用中。 (尽管我个人更喜欢 createObject(),IMO 体积较小)

<cfset arrayOfStrings = ["tableName1","tableName2"] />
<cfset tableNames.string = arrayOfStrings  />

<cfinvoke ....>
    <cfinvokeargument name="authToken" value="#AuthToken#"/>
    <cfinvokeargument name="tableNames" value="#tableNames#"/>
</cfinvoke>