【问题标题】:Issue using .net web service from ColdFusion使用 ColdFusion 的 .net Web 服务时出现问题
【发布时间】:2013-03-13 12:40:19
【问题描述】:

我在尝试使用 ColdFusion 的 Web 服务时遇到了一些挑战。服务 (AccountsService) 有一个方法 GetAccountLinksByUser,它返回与给定用户关联的帐户。此方法接受两个参数:

  • UPN,它只是用于标识用户的唯一字符串。据我所知,这没问题。

  • 源类型。这最终是一个字符串,但在 WSDL 中被定义为具有三个可能值之一的简单类型。以下是 WSDL 中 XML 的相关部分:

<xsd:simpleType name="SourceType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="All"/>
        <xsd:enumeration value="Manual"/>
        <xsd:enumeration value="System"/>
    </xsd:restriction>
</xsd:simpleType>

问题是我似乎不能只将字符串“All”、“Manual”或“System”传递到 Web 服务中。 CF 生成的存根对此方法具有以下签名:

getAccountLinksByUser(java.lang.String, org.datacontract.schemas._2004._07.tfonline_services_accounts_datacontracts.SourceType)

这似乎表明我需要传入 org.datacontract.schemas._2004._07.tfonline_services_accounts_datacontracts.SourceType 的实例。但是,我无法(轻松)创建该类型的实例,因为它似乎不在 CF 搜索的类路径中。我尝试将 CF 生成到 /stubs 目录中的类包装到 jar 中,并将它们放在类路径中。这确实有效,因为我现在可以创建 org.datacontract.schemas._2004._07.tfonline_services_accounts_datacontracts.SourceType 的实例,但我仍然无法将其传递给 getAccountLinksByUser 方法。

根据要求,这是我用来调用网络服务的代码:

<cfset accountsService = CreateObject("WebService", "http://local.hostname/libraries/com/foo/bar/staging/AccountsService.wsdl") />
<cfset SourceType = CreateObject("java", "org.datacontract.schemas._2004._07.tfonline_services_accounts_datacontracts.SourceType") />
<cfset accounts = accountsService.getAccountLinksByUser("username@domain", SourceType.All) />

更多信息。 Web 服务的发布者不会公开发布其 WSDL。这是通过电子邮件发送给我的,我正在从我的本地开发站点加载 WSDL。

我得到的具体错误是:

无法执行 Web 服务调用 getAccountLinksByUser。 调用web service操作返回的错误是:

无法执行 Web 服务调用 getAccountLinksByUser。错误 调用 Web 服务操作时返回的是:'' java.lang.IllegalArgumentException:参数类型不匹配

我现在不确定该去哪里。有什么建议吗?

服务是用 .NET 编写的。

【问题讨论】:

  • 您能分享一下您尝试使用来调用服务的 ColdFusion 代码吗?
  • 解决方法是否在此线程帮助中途:houseoffusion.com/groups/cf-talk/thread.cfm/threadid:30232
  • @Miguel-F 我已经用一些示例代码更新了问题以使用 Web 服务、另一个细节以及 CF 抛出的特定错误。
  • @barnyr - 我假设你在谈论关于将存根复制到类路径并使用 enum.fromString() 的 Tom Jordahl 帖子?嗯,是。我已经将类放在类路径上(这样我就可以创建 SourceType),但是上面没有 fromString()。另外,那篇文章是 2004 年的,我认为是关于 CF 6 的。
  • 只传入一个字符串会发生什么? &lt;cfset accounts = accountsService.getAccountLinksByUser("username@domain", "All") /&gt;

标签: web-services coldfusion enumeration


【解决方案1】:

我进行了一些测试,似乎与在 CF10 中切换到 Axis2 有关。老实说,我不确定 枚举在 1 和 2 之间发生了哪些变化。但是,将版本级别设置回 Axis1 应该可以解决问题:

<cfscript>
     args = { refreshWSDL=true, wsversion=1 };
     ws = createObject("webservice", "http://mysite/test.asmx?wsdl", args);
     result = ws.getAccountLinksByUser("test@somewhere.com", "All");
     writeDump(result);
</cfscript>

【讨论】:

  • 这似乎已经解决了问题!几天前我已经尝试过了,但我没想到在测试之前删除存根并得到了假阴性。感谢您指出这一点并让我再试一次。
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 2022-09-25
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
相关资源
最近更新 更多