Веб-служба Dynamics NAV 2016: параметр * в методе * в службе * равен нулю

Я пытаюсь получить один контакт из моей веб-службы Dynamics Nav (Dynamics Nav 2016). Я делаю это с помощью SOAP-запроса в PHP.

Веб-сервис представляет собой кодовый блок, который содержит две функции:

fGetContact(iContactNumber : Text[20]) oContact : Text[250]
IF rContact.GET(iContactNumber) THEN BEGIN
oContact := '';
oContact := rContact."No." + ';' +
rContact."Company Name" + ';' +
rContact."First Name" + ';' +
rContact.Surname + ';' +
rContact."E-Mail";
END;
EXIT(oContact);

fGetContacts() oContacts : Text[250]
IF rContact.GET('KT100190') THEN BEGIN
oContacts := '';
oContacts := rContact."No." + ';' +
rContact."Company Name" + ';' +
rContact."First Name" + ';' +
rContact.Surname + ';' +
rContact."E-Mail";
END;
EXIT(oContacts);

Вторая функция, fGetContacts, работает нормально.
Но когда я вызываю fGetContact с контактным номером в качестве параметра, он возвращает следующую ошибку:

Parameter iContactNumber in method FGetContact in service MyService is null!

Я использую NTLMSoapClient как следующее:

<?php
ini_set('soap.wsdl_cache_enabled', '0');

require_once 'ntlmstream.php';
require_once 'ntlmsoapclient.php';

$url = 'http://localhost:7047/DynamicsNAV90/WS/CRONUS/Codeunit/MyService';

$options = array(
'uri' => $url,
'location' => $url,
'trace' => true,
'login' => 'my_user',
'password' => 'my_password'
);

// we unregister the current HTTP wrapper
stream_wrapper_unregister('http');

// we register the new HTTP wrapper
stream_wrapper_register('http', 'MyServiceProviderNTLMStream') or die("Failed to register protocol");

// so now all request to a http page will be done by MyServiceProviderNTLMStream.
// ok now, let's request the wsdl file
// if everything works fine, you should see the content of the wsdl file
$client = new MyServiceNTLMSoapClient(null, $options);

// should display your reply
try {
$params = array('iContactNumber' => 'KT100190');

echo '<pre>';
echo $client->FGetContacts(); // works
echo $client->FGetContact($params); // doesn't work
echo '</pre>';
} catch (SoapFault $e) {
echo '<pre>';
var_dump($e);
echo '</pre>';
}

// restore the original http protocole
stream_wrapper_restore('http');

Я также попытался вызвать функцию следующим образом:

echo $client->FGetContact('KT100190');

Ошибка возврата такая же, как и раньше.

Я проверил свою функцию с SoapUI и возвращаемое значение точно, как это должно быть.

Запрос:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:new="urn:microsoft-dynamics-schemas/codeunit/MyService">
<soapenv:Header/>
<soapenv:Body>
<new:FGetContact>
<new:iContactNumber>KT100190</new:iContactNumber>
</new:FGetContact>
</soapenv:Body>
</soapenv:Envelope>

Отклик:

<Soap:Envelope xmlns:Soap="http://schemas.xmlsoap.org/soap/envelope/">
<Soap:Body>
<FGetContact_Result xmlns="urn:microsoft-dynamics-schemas/codeunit/MyService">
<return_value>KT100190;Add-ON Marketing;Chris;McGurk;[email protected]</return_value>
</FGetContact_Result>
</Soap:Body>
</Soap:Envelope>

Так что я делаю не так, что появляется эта ошибка и как я могу ее исправить?

0

Решение

Для чего бы это ни стоило, у меня была эта проблема, и я решил ее, добавив «cache_wsdl» => WSDL_CACHE_NONE в опции мыльного клиента.

Некоторые поля отсутствовали из-за проблемы с кешем после обновления WSDL.

1

Другие решения

Я сделал обходной путь, и теперь он работает для меня.

Я изменил переменную $ request в классе NTLMSoapClient, потому что мыльный конверт, который php отправил в мой сервис, был абсолютно бесполезен.

В общем, я просто сделал это перед действиями curl:

$request = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:new="urn:microsoft-dynamics-schemas/codeunit/MyService">
<soapenv:Header/>
<soapenv:Body>
<new:FGetContact>
<new:iContactNumber>'.$this->iContactNumber.'</new:iContactNumber>
</new:FGetContact>
</soapenv:Body>
</soapenv:Envelope>';

(Если у кого-то есть такая же проблема, попробуйте var_dump ($ request) и просмотрите исходный код в браузере. Вы увидите, что там сделал беспорядок PHP …)

0

По вопросам рекламы [email protected]