ColdFusion - SOAP服务请求错误"无法找到Web服务操作。"

时间:2014-05-01 20:03:29

标签: web-services soap coldfusion wsdl

所以我对SOAP很新,我正在尝试连接到国家气象服务的SOAP服务,以便将预测数据提取到我的网页上。以下是此过程的简短代码:

    <cfinvoke
    webservice="http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl"
    method="NDFDgen"
    returnvariable="aTemp">

        <cfinvokeargument name="latitude" value="37.94"></cfinvokeargument>
        <cfinvokeargument name="longitude" value="-75.47"></cfinvokeargument>
        <cfinvokeargument name="product" value='"glance"'></cfinvokeargument>
        <cfinvokeargument name="startTime" value="2014-05-02T12:00"></cfinvokeargument>
        <cfinvokeargument name="endTime" value="2014-05-05T12:00"></cfinvokeargument>
        <cfinvokeargument name="Unit" value='"e"'></cfinvokeargument>
        <cfinvokeargument name="weatherParameters" value="maxt = TRUE"></cfinvokeargument>
    </cfinvoke>

问题是,当我尝试运行我的网页时,我收到以下错误:

Web service operation NDFDgen with parameters {Unit={"e"},startTime={2014-05-02T12:00},endTime={2014-05-05T12:00},product={"glance"},longitude={-75.47},weatherParameters={maxt = TRUE},latitude={37.94}} cannot be found.

我有点困惑,因为NDFDgen操作确实存在于我正在检索的WSDL文件中,并且我已经解决了NDFDgen操作所需的所有参数。

链接到我尝试使用的WSDL文件: http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl

使用必需参数链接到功能页面: http://graphical.weather.gov/xml/#use_it

有人能看到我的代码有什么问题吗?这可能与我的论点有关,我正在传递给SOAP?我甚至尝试遵循Stack Overflow问题(Consuming ColdFusion webservice - Web service operation with parameters {} cannot be found)的建议并添加了

refreshwsdl="yes"

属于我的<cfinvoke>,但我仍然遇到同样的错误。

1 个答案:

答案 0 :(得分:2)

对于复杂的Web服务,通​​常更容易使用xml + cfhttp路由,就像Chester建议的那样。但是,为了回答你的问题,这些论点存在一些问题。这就是错误信息的含义。可能存在该名称的方法,但其签名与您提供的值不匹配。参数的 number 中存在不匹配,或者在这种情况下,参数的类型不匹配。

  • 根据wsdl,start/endTime值必须是日期。虽然CF可以隐式转换各种美国日期字符串,但它无法解析您使用的格式:yyyy-MM-ddThh:mm。因此,要么使用date objects,要么使用&#34;可解析的&#34;,日期字符串,例如yyyy-MM-dd hh:mm:ss

  • &#34; weatherParameters&#34;参数应该是结构(或复杂类型)而不是字符串:

    <cfset weather = {maxt=true}>
    ...
    <cfinvokeargument name="weatherParameters" value="#weather#">

  • ProductUnit值的引号太多。通过使用value='"glance"',您实际上将双引号作为值的一部分。这可能会导致错误,因为远程Web服务希望收到glance(没有引号)。

  • 虽然它不会导致错误,但您不需要包含结束标记:</cfinvokeargument>。如果您希望关闭它,使用快捷方式<cfinvokeargument ... />

  • 会更清晰


通过这些更改,您的通话应按预期工作。虽然您可能需要考虑切换到createObject,而不是cfinvoke。然后,您可以转储Web服务对象以进行调试。它也不那么笨重的IMO。

<cfscript>
    ws = createObject("webservice", "http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl");
    //show web service methods for debugging purposes
    writeDump(ws);

    // construct arguments
    args = {latitude="37.94"
            , longitude="-75.47"
            , product="glance"
            , startTime="2014-05-02 12:00:00"
            , endTime="2014-05-05 12:00:00"
            , Unit="e"
            , weatherParameters={maxt=true}
        };

    // call the method
    result  = ws.NDFDgen(argumentCollection=args);

    writeDump(result)
</cfscript>