PHP SOAP -ERROR: Схема синтаксического анализа: элемент уже определен при подключении к D365 WSDL - PullRequest
1 голос
/ 21 января 2020

Я подключаюсь к динамику 365. Раньше он работал отлично, я заворачиваюсь, чтобы получить токен, затем я использую его как заголовок авторизации вместе с php soapclient, и он работает, я подключаюсь, я создаю клиента и могу звонить мои методы.

Внезапно он решил не работать, и где он использовал для подключения, как SOAP 1.1, теперь он принудительно SOAP 1.2 После изменения с SOAP 1.1 на SOAP 1.2 (потому что я получил ошибка несоответствия привязки, в которой было указано ожидаемое приложение / soap + xml и текст / xml). Таким образом, я изменил версии, и эта ошибка исчезла, и ее заменили ERROR Fetching HTTP Headers.

Эта ошибка застряла дольше всего, люди предлагали увеличить тайм-аут, но я все равно поднял его до 500 800 5000.

И вдруг он начал давать мне SOAP ОШИБКА. Элемент схемы синтаксического анализа уже определен. Я не изменил свой код, я какое-то время играл с заголовками, но безрезультатно, я даже удалил заголовок авторизации, просто чтобы посмотреть, что происходит, и это ничего не дало, я продолжал получать ту же ошибку.

SOAP-ERROR: Parsing Schema: element 'http://schemas.datacontract.org/2004/07/Microsoft.Dynamics.Ax.Xpp:XppObjectBase' already defined [string:Exception:private]

каждый раз, когда я пытаюсь подключиться, я получаю различную ошибку синтаксического анализа, хотя я ничего не меняю в своем коде:

SOAP-ERROR: Parsing Schema: element 'http://schemas.microsoft.com/2003/10/Serialization/:anyType' already defined [string:Exception:private]

и еще один

SOAP-ERROR: Parsing Schema: element 'http://schemas.datacontract.org/2004/07/Microsoft.Dynamics.AX.KernelInterop:ProxyBase' already defined [string:Exception:private] 

, а затем иногда проходит через секунду, но с извлечением ошибки заголовка http снова ..

, поэтому я не могу больше создавать экземпляр клиента сейчас ... где раньше я мог создать экземпляр клиента, но я получаю ошибку, когда я вызвать метод «Ошибка получения заголовков HTTP»

что-то определенно не является стабильным, потому что мои ошибки не единичны.

Теперь некоторые утверждают, что wsdl может быть неисправен, но это Microsoft, и человек, с которым я общаюсь, постоянно говорит, что он ничего не может с этим поделать.

Справка: это проблема PHP, проблема с динамикой или проблема с wsdl.

И как ее решить.

Спасибо.

ОБНОВЛЕНИЕ

Извините, я упоминал ранее, что это Dynamics AX, оказывается, это Dynamics 365 D365. Я буду держать динамический топор на случай, если он поможет кому-то, кому нужны решения.

ОБНОВЛЕНИЕ Ниже приведен код подключения, который я использую:

function getAuthenticationHeader()
{
   //Each variable has the values for our server
   //resource
   $appResource = urlencode($appADResource);
   //clientID
   $appClientID = urlencode($appADClientId);
   //appSecret
   $appSecret = urlencode($appADSecret);
   //username
   $appUserID = urlencode($appUserID);
   // Password
   $appUserPassword = urlencode($password);

   // Construct the body for the STS request
   $authenticationRequestBody =  'resource='.$appResource.'&client_id='.$appClientID.'&client_secret='.$appSecret.'&grant_type=password&username='.$appUserID.'&password='.$appUserPassword.'&scope=openid';

   //Using curl to post the information to STS and get back the authentication response    
   $ch = curl_init();
   // set url 
   $stsUrl = 'https://login.microsoftonline.com/'.$appTenantId.'/oauth2/token';        

   curl_setopt($ch, CURLOPT_URL, $stsUrl); 
   // Get the response back as a string 
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

   // Set the parameters for the request
   curl_setopt($ch, CURLOPT_POSTFIELDS,  $authenticationRequestBody);

   // By default, HTTPS does not work with curl.
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   // read the output from the post request
   $output = curl_exec($ch);         
   // close curl resource to free up system resources
   curl_close($ch);      
   // decode the response from sts using json decoder
   $tokenOutput = json_decode($output);

   return $tokenOutput->{'token_type'}.' '.$tokenOutput->{'access_token'};
}
try
{
    //WSDL Link
    $url = "https://urlToOurServer/services/webservice?wsdl";

    $authorizationToken = getAuthenticationHeader();
    $context = stream_context_create(array(
                'ssl'   => array(
                    'verify_peer'       =>  false, 
                    'verify_peer_name'  =>  false,
                    'allow_self_signed' =>  true
                ),
                'https' => array(
                    'curl_verify_ssl_peer'  => false,
                    'curl_verify_ssl_host'  => false
                    ),              
                'http'  => array(
                    'header'    =>'Authorization: '.$authorizationToken         
                    )
    )); 

    //Create array of Soap Options
    $arrOpt = array(
    "soap_version"      => SOAP_1_2,
    "cache_wsdl"        => WSDL_CACHE_NONE,
    "exceptions"        => true,
    'trace'             => true,
    'encoding'          => 'UTF-8',
    'stream_context'    => $context 
    );
}catch(Exception  $e)
{
    print_r($e);
}

Я также нашел это в моем wsdl

<sp:IssuedToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<sp:RequestSecurityTokenTemplate>
<trust:TokenType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0
</trust:TokenType>
<trust:KeyType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer
</trust:KeyType>
</sp:RequestSecurityTokenTemplate>
<wsp:Policy>
<sp:RequireInternalReference/>

Как я могу подключиться к SAML для токена?

Ответы [ 2 ]

3 голосов
/ 21 января 2020

Если все примерно так же, но не работает, первое, что нужно сделать, это исключить большинство основных проблем c AX. Это может не решить вашу проблему, но будет хорошим первым шагом.

теперь некоторые утверждают, что wsdl может быть неисправен, но это Microsoft, и человек, с которым я общаюсь, постоянно говорит, что он ничего не может сделать об этом.

Кем бы не был человек, вам необходимо подтвердить, что он сделал следующее:

  1. Подтвердите среду и в частности, CIL полностью скомпилирован. Сделайте полный AXBuild и полный CIL, чтобы быть уверенным в нерабочее время и убедиться, что результат хороший. Это в основном говорит «перекомпилировать все».

  2. Refre sh конфигурация WCF в конфигурации клиента, которую вы используете для подключения к AX. Эта конфигурация клиента может быть файлом * .ax c или может быть только активной. Также refre sh бизнес-коннектор WCF. Это отдельно и может быть то, что вы используете для подключения к AX. Об этом говорит большинство людей.

Вот небольшая статья , в которой говорится о создании конфигурации, но я расскажу ниже.

Конфигурация клиента AX в конечном итоге представляет собой набор текста. Он либо хранится в файле .axc, либо хранится в реестре в нескольких местах. Конфигурация клиента Business Connector может быть той, которая пропускается в вашем сценарии.

Если вы перейдете по ссылке выше и создадите новый файл конфигурации .axc и убедитесь, что вы нажали «Refre sh Configuration» "перед экспортом, когда вы откроете файл в Блокноте, вы увидите wcfconfig и несколько XML, следующих за ним. Это XML - это то, что вы пытаетесь обновить. Создание нового AX C - это всего лишь упражнение, которое поможет вам понять, что это такое. Вы можете удалить файл после того, как закончите поиск.

enter image description here

Итак, вы в основном создали указанный c файл конфигурации, но это не значит, что что-то его использует. Если вы позвоните AX32.exe, то по умолчанию будет тот, который загружен на этом экране конфигурации. Использование файла - это способ очень точно выбрать его. Ваш код, вероятно, использует где-то определенный c AXC, который нужно либо заменить, либо обновить ИЛИ , он использует тот, который сохранен в этом окне:

enter image description here

Весьма вероятно, что используется один из двух , сохраненных в этом окне конфигурации. Когда вы ссылаетесь на sh в этом окне, в конечном итоге WCF XML сохраняется в windows реестре на машине, на которой размещен клиент и / или AOS в подпапках в HKLM\SOFTWARE\Microsoft\Dynamics\6.0\Configuration. Ключ (и) - wcfconfig в паре с wcfconfigversionid, который просто хранит GUID, чтобы увидеть, если он обновлен.

Когда я говорю two , я имею в виду наиболее люди даже не удосужились взглянуть на Business Connector AX C. Это то, что выделено на моем изображении желтым цветом, и вам нужно специально выбрать и обновить sh. Это может быть важно для вас. По моему образу я не выбрал его. Вам нужно выйти из меню и выбрать его.

На компьютере разработчика вы можете просто стереть обе эти клавиши и обновить sh, и вы должны увидеть, какую конфигурацию вы работаете над обновлением.

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

0 голосов
/ 22 января 2020

Поскольку вы говорите, что это не Dynamics AX, а одна из версий Dynamics 365. Версию AX раньше называли Dynamics 365 for Finance and Operations Enterprise Edition, но они снова изменили лицензирование / наименование, поэтому я даже не знаю, как это технически называется. Большинство людей называют это Dynamics 365 for Operations или каким-либо другим вариантом.

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

https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/data-entities/third-party-service-test

...