0

Dynamics Nav Webサービス(Dynamics Nav 2016)から1つの連絡先を取得しようとしています。私はPHPでSOAPリクエストを使ってこれを行います。 、Dynamics NAV 2016 Webサービス:サービス*のメソッド*のパラメータがnullです

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正常に動作します:

Webサービスは、2つの機能が含まれていcodeunitです。 しかし、私は、パラメータとして連絡先の電話番号と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で私の関数をテストしました。返り値は正確にはそれが得られる値です。

要求:

応答:

<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

私は回避策を講じてくれました。

私のサービスに送られたsoapエンベロープが全く役に立たなかったので、クラスNTLMSoapClientの$ request変数を変更しました。

だから、基本的に、私はちょうどカールアクションの前にこれをしなかった:

$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($要求)とソースの表示をしてみてくださいあなたは混乱PHPは何をしたかが表示されます。そこに...)

1

私はこの問題を抱えていて、 "cache_wsdl" => WSDL_CACHE_NONEをSOAPクライアントのオプションに追加することで解決しました。

WSDLの更新後にキャッシュの問題が発生したため、一部のフィールドが欠落していました。

関連する問題