ColdFusion 2016中的Web服务不再起作用

MPa*_*aul 10 coldfusion axis wsdl axis2 web-services

我正在从ColdFusion 9升级到ColdFusion 2016,我的网络服务突然不再起作用了.我相信这是因为Axis 2是在Cold Fusion 10中引入的,并且它使我现有的Web服务无法正常运行.

即使我在ColdFusion Administrator中将Web服务版本设置为1,它仍然无效.

我称这些Web服务的方式是createObject这样的功能:

<cfscript>
    objSoapHeader = XmlParse("<wsse:Security mustUnderstand=""true"" xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""><wsse:UsernameToken><wsse:Username>USERNAME</wsse:Username><wsse:Password>PASSWORD</wsse:Password></wsse:UsernameToken></wsse:Security>");

    Application.UserWebService = CreateObject("webservice", PATH & "Requests/UserService.asmx?WSDL");
    addSOAPRequestHeader(Application.UserWebService,"","",objSoapHeader,true);

    // Get the .Net resources
    Application.NetResources = Application.UserWebService.GetNetResources(); 

</cfscript>
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

无法执行Web服务调用GetNetResources.

调用Web服务操作时返回的错误是:java.lang.RuntimeException:从数据源获取解析器时出错:LanguageHeader不能为null!

它表明LangaugeHeader不可能null.WSDL显示与GetNetResources操作关联的两条消息:

<wsdl:portType name="UserServiceSoap">
    <wsdl:operation name="GetNetResources">
        <wsdl:input message="tns:GetNetResourcesSoapIn"/>
        <wsdl:output message="tns:GetNetResourcesSoapOut"/>
    </wsdl:operation>
</wsdl:portType >
Run Code Online (Sandbox Code Playgroud)

但是,在查看消息列表时,我可以看到与GetNetResources相关的三条消息:

<wsdl:message name="GetNetResourcesSoapIn">
    <wsdl:part name="parameters" element=tns:GetNetResources"/>
</wsdl:message>
<wsdl:message name="GetNetResourcesSoapOut">
    <wsdl:part name="parameters" element=tns:GetNetResourcesResponse"/>
</wsdl:message>
<wsdl:message name="GetNetResourcesLanguageHeader">
    <wsdl:part name="parameters" element=tns:LanguageHeader"/>
</wsdl:message>
Run Code Online (Sandbox Code Playgroud)

如果操作只指定了两条消息,那么WSDL文件中第三条消息与操作相关联的位置是什么?

看起来LanguageHeader参数在ColdFusion 2016中是绝对必需的,所以为什么它在ColdFusion 9(Axis 1)中工作?

编辑1

要回答上面我的第一个问题(删除线了)我发现下面的代码binding,而不是到portType:

<wsdl:binding name="UserServiceSoap" type="tns:UserServiceSoap">
    <wsdl:operation name="GetNetResources">
        <soap:operation style="document" soapAction="http://tempuri.org/GetNetResources"/>
        <wsdl:input>
            <soap:body use="literal"/>
            <soap:header message="tns:GetNetResourcesLanguageHeader" use="literal" part="LanguageHeader"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
Run Code Online (Sandbox Code Playgroud)

然而,这仍然没有回答我的第二个问题.

编辑2

在稍微使用代码之后,我RuntimeException通过向Web服务调用添加变量来解决问题.

args = {TEST="<locale>en-CA</locale>"};
Application.NetResources = Application.UserWebService.GetNetResources(argumentCollection=args);
Run Code Online (Sandbox Code Playgroud)

现在导致以下错误:

在提供的参数{TEST}中找不到Web服务参数名称languageHeader.

由于TEST它不是WSDL中指定的实际参数,我将其修改为languageHeader,并收到此新错误:

无法找到参数为{LANGUAGEHEADER = {<locale> en-CA </ locale>}}的Web服务操作GetNetResources.

这表明languageHeader确实是正确的参数名称,但是它仍然无法找到Web服务操作,因此我认为参数的"类型"是不同的.

也许我不是假设要发送一个字符串作为值,但回顾我的WSDL,它声明它们的类型Locale是一个字符串:

<wsdl:types>
    <s:schema targetNamespace="http://tempuri.org/" elementFormDefault="qualified">
        <s:element name="LanguageHeader" type="tns:LanguageHeader"/>
        <s:complexType name="LanguageHeader">
            <s:sequence>
                <s:element name="Locale" type="s:string" maxOccurs="1" minOccurs="0"/>
            </s:sequence>
            <s:anyAttribute/>
        </s:complexType>
    </s:schema>
</wsdl:types>
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我想发送一个complexType对象作为包含Locale字符串的参数.

如果是这样的话,我会从CFML发送什么样的对象?

MPa*_*aul 1

使用具有复杂数据类型参数的 Web 服务时,发送 astructure作为参数。

// Create struct
stLanguageHeader = structNew();
stLanguageHeader.locale = "en-CA";

Application.NetResources = Application.UserWebService.GetNetResources(stLanguageHeader); 
Run Code Online (Sandbox Code Playgroud)