Подтвердить что ты не робот

Веб-службы в ColdFusion 2016 больше не функционируют

Я обновляюсь от ColdFusion 9 до ColdFusion 2016, и мои веб-службы внезапно перестают работать. Я верю, потому что Axis 2 был введен в Cold Fusion 10, и с его помощью мои существующие веб-службы не функционировали.

Даже если я вернул версию веб-службы в 1 в ColdFusion Administrator, она все равно не работает.

Как я называю эти веб-службы с помощью функции 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>

Я получаю ошибку:

Невозможно выполнить вызов веб-службы GetNetResources.

Ошибка при вызове операции веб-службы is: java.lang.RuntimeException: ошибка получения парсера из данных source: 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 >

Однако при просмотре списка сообщений я вижу три сообщения, связанные с 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>

Если операция содержит только два сообщения, то где в файле WSDL это третье сообщение связано с операцией?

Кажется, что параметр LanguageHeader абсолютно необходим и применяется в ColdFusion 2016, так почему он работал в ColdFusion 9 (Axis 1)?

РЕДАКТИРОВАТЬ 1

Чтобы ответить на мой первый вопрос выше (striked out), я нашел следующий код в 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>

Однако это еще не отвечает на мой второй вопрос.

РЕДАКТИРОВАТЬ 2

Немного поиграв с кодом, я решил разрешить RuntimeException, добавив переменную в вызов веб-службы.

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

Что теперь приводит к следующей ошибке:

Язык имени параметра веб-службыHeader не может быть найден в при условии параметров {TEST}.

Поскольку TEST не является фактическим параметром, указанным в WSDL, я изменил его на languageHeader и получил эту новую ошибку:

Операция веб-сервиса GetNetResources с параметрами {LANGUAGEHEADER = {<locale> en-CA </locale> }} не может быть найдена.

Это означает, что languageHeader действительно является правильным именем параметра, однако он все еще не может найти операцию веб-службы, поэтому я считаю, что "тип" параметра отличается.

Возможно, я не предполагаю, что вы отправляете строку в качестве значения, но, оглядываясь назад на мой 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>

Из того, что я понимаю, я предполагаю, что вы отправляете объект complexType в качестве параметра, который содержит Locale в виде строки.

Какой объект я должен отправлять из CFML, если это так?

4b9b3361