在为GetTablesBin
方法调用Webservice API时,我收到错误Web service operation GetTablesBin with parameters cannot be found.
Webservice调用代码
<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 stubs文件夹中缺少方法类。
任何指针都会非常有用吗?
答案 0 :(得分:1)
Web服务操作GetTablesBin 带参数 {...}无法找到。
注意它说“带参数”?微妙的区别,但它或者意味着a)方法根本不存在或b)它 存在,但是接收错误的数量或类型的参数。在这种情况下,问题是“b)”。
在对Web服务问题进行故障排除时,创建Web服务实例通常很有帮助,然后转储该对象以查看该方法所需的参数。根据CF11,“GetTablesBin”方法需要两个参数:String
和ArrayOfString
。但是,当前代码传递了两个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:
...
的数组ArrayOfString
没有直接映射。所以它本质上是 被视为一种结构,就像任何其他复杂类型一样。如果你看 在wsdl中,ArrayOfString包含一个名为string
的密钥,其名称为type="s:string"
value是createObject()
:
要解决此错误,只需使用正确的密钥创建一个结构并将其传递给cfinvoke调用。 (虽然我个人更喜欢<cfset arrayOfStrings = ["tableName1","tableName2"] />
<cfset tableNames.string = arrayOfStrings />
<cfinvoke ....>
<cfinvokeargument name="authToken" value="#AuthToken#"/>
<cfinvokeargument name="tableNames" value="#tableNames#"/>
</cfinvoke>
,这是一个不那么笨重的IMO)
.