0

我正在尝试使用 WCF 网络服务。

<cfdump>将函数显示为

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))>

错误:

Message argument type mismatch

4

3 回答 3

1

首先看一下服务的WSDL对象是如何序列化的。创建 cf 组件,将其命名为 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)
于 2013-01-03T21:08:41.350 回答
1

在阅读了@Leigh 的评论和一点 Google'ing 之后,我发现了以下关于Debugging ColdFusion Webservices的文章。对于这个问题(以及@Leigh 所指的内容)特别感兴趣的是编号 2 下的项目符号项(朝向页面底部)。如果引用的页面被删除,我将在此处包含该信息。

如果您有一段时间使用或作为参数类型java.lang.IllegalArgumentException: argument type mismatch调用 .Net Web 服务,那么很可能您没有正确定义数据类型。和会导致你相信.Net 期待一个数组。但请记住 ColdFusion 数组与 .Net 数组不同。如果您仔细查看 wsdl,您会注意到被定义为 complexType 名称。ArrayOfIntArrayOfStringArrayOfIntArrayOfStringArrayOfInt

<s:complexType name="ArrayOfInt">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="int" type="s:int" />
</s:sequence>
</s:complexType>

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

<cfset objGroupIds = StructNew()>
<cfset objGroupIds._int = ListToArray("627303")>
<cfset callResult = myObj.getUser(objGroupIds)>
于 2013-01-04T17:15:04.087 回答
0

从参考的角度来看,有几件事可能会有所帮助......

http://msdn.microsoft.com/en-us/library/kskex131%28v=vs.90%29.aspx 数组数据类型实际上不是在 .Net 中的 Array 对象上预定义的,而是由数组元素的数据类型预定义的.

http://msdn.microsoft.com/en-us/library/ff690589%28v=sql.105%29.aspx 这是一个基本模式,它定义了数组参数可以包含的数据类型(例如 ArrayOfInt)。这似乎是由 wsdl 模式定义的。

在无法测试的情况下抓住稻草,如果您创建并传递一个隐式数组而不是尝试将值分配给特定索引会怎样。另一个问题可能是您正在尝试将数组转换为 java int 数据类型......不确定这是否可行。在将值分配给数组时可能想要进行强制转换。

<cfset stResult = wsUser.GetVwEmpByLocs([2092])>
or
<cfset locationID = [2092]>
<cfset stResult = wsUser.GetVwEmpByLocs(locationID)>
于 2013-01-04T13:01:14.530 回答