使用ArrayFint参数输入使用wcf Web服务

使用ArrayFint参数输入使用wcf Web服务,wcf,coldfusion,Wcf,Coldfusion,我正在尝试使用WCF Web服务 将函数显示为 getVwEmpByLocs(com.microsoft.schemas._2003._10.serialization.arrays.ArrayOfint) 更新: <cfset wsUser = createobject("webservice", "http://xxxxxxx/cardService.svc?wsdl")> <cfdump var="#wsUser#"> <cfset locationID

我正在尝试使用WCF Web服务

将函数显示为

getVwEmpByLocs(com.microsoft.schemas._2003._10.serialization.arrays.ArrayOfint)
更新:

<cfset wsUser = createobject("webservice", "http://xxxxxxx/cardService.svc?wsdl")>
<cfdump var="#wsUser#">

<cfset locationID = []>
<cfset locationID[1] = 2092>
<cfset stResult = wsUser.GetVwEmpByLocs(javacast('int[]', locationID))>

错误:

<cfset wsUser = createobject("webservice", "http://xxxxxxx/cardService.svc?wsdl")>
<cfdump var="#wsUser#">

<cfset locationID = []>
<cfset locationID[1] = 2092>
<cfset stResult = wsUser.GetVwEmpByLocs(javacast('int[]', locationID))>

消息参数类型不匹配

首先查看服务的WSDL对象对象是如何序列化的。创建cf组件名称it ArrayOfInt.cfc

component  displayname="ArrayOfint"
{
    property name="int" type="Array" notnull="True" getter="false" setter="false";
    this['int'] = ArrayNew(1);
    function init(){  return this; }
}
像这样传递值

arrOfInt = createobject('component','ArrayOfInt').init();
arrOfInt.int[1] = 100;
arrOfInt.int[2] = 200;
getVwEmpByLocs(arrOfInt)

从参考的角度来看,以下几点可能会有所帮助

实际上,数组数据类型不是由.Net中的数组对象预定义的,而是由数组元素的数据类型预定义的

这是一个基本模式,用于定义数组参数可以包含的数据类型(例如ArrayOfInt)。这似乎是由wsdl模式定义的

在没有测试能力的情况下抓住稻草,如果您创建并传递一个隐式数组,而不是尝试将值分配给特定索引,该怎么办。另一个问题可能是您试图将数组强制转换为java int数据类型。。。我不确定这是否有效。将值分配给数组时,可能需要执行强制转换

<cfset stResult = wsUser.GetVwEmpByLocs([2092])>
or
<cfset locationID = [2092]>
<cfset stResult = wsUser.GetVwEmpByLocs(locationID)>

在阅读了@Leigh和一个小Google'ing的评论后,我发现了以下关于的文章。这个问题(以及@Leigh所指的内容)特别感兴趣的是第2项下的项目符号(朝向页面底部)。我将在这里包括这些信息,以防引用的页面被删除

如果在使用
ArrayOfInt
ArrayOfString
作为参数类型调用.Net Web服务时,遇到
java.lang.IllegalArgumentException:参数类型不匹配
,则很可能是您没有正确定义数据类型。
ArrayOfInt
ArrayOfString
会让您相信.Net正在期待一个数组。但是请记住ColdFusion数组与.Net数组不同。如果仔细查看wsdl,您会注意到,
ArrayFint
被定义为complexType名称


CF中的复杂类型映射到结构。此外,您会注意到这个复杂类型有一个name=“int”的元素。现在,当java查看wsdl并创建存根类文件时,它会将该元素重命名为“_int”。我猜这是因为“int”在Java中是一个保留字,也是一种本机数据类型。因此,这意味着要成功调用.Net Web服务,您需要:



ArrayFint是一种.net数据类型。没有名为intThis的CF变量会收到错误消息:
Web服务操作getVwEmpByLocs,参数为{[(Component=ArrayOfInt)]}找不到。
如Shirak所说,请查看wdsl定义。IIRC它类似于
ArrayOfString
(只是使用
int
而不是
string
),因此,我现在无法测试它,但基本上是这样做的
someStructure.int=[cf整数数组]@Miguel-F-Yep,这基本上就是我在另一个线程中描述的。我认为如果您创建一个包含整数数组的键
int
的结构,它应该可以工作。(编辑)Shirak的方法也可能有效,但使用简单结构的方法更简单。@Miguel-F-这一个有效,我喜欢它更简单,Shirak的解决方案
<cfset objGroupIds = StructNew()>
<cfset objGroupIds._int = ListToArray("627303")>
<cfset callResult = myObj.getUser(objGroupIds)>