2013-10-22 2 views
0

Acomba 테이블에서 고객을 업데이트하는 php로 작성된 서버에 Webservice가 있습니다. 서비스는 고객을 올바르게 업데이트하지만 XML이 제대로 닫히지 않았기 때문에 응답을 받으면 웹 페이지가 충돌합니다. 나는 ajax로 Webservice를 호출한다. SOAPFault의 예외 : 우리는 C에는 XML 문서를 가지고없는 것처럼 [클라이언트] 보이는 : \을 InetpubSOAP 응답이 제대로 닫히지 않았습니다.

기록 오류 ... 나는 전화 또는 웹 서비스 중 하나를 작성하지 않았다하지만 난 그것을 해결해야 \ wwwroot에 \ 유레카 \ 아약스 \ syncContratAvenant.php : 85

스택 추적 : C : \을 Inetpub \ wwwroot에 \ 유레카 \ 아약스 \ syncContratAvenant.php (85) : SoapClient -> __의 SOAPCall ('saveClientAvena ...' 어레이)

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:SOAP_AvenantAcomba" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<SOAP-ENV:Body><ns1:saveClientAvenant><param0 xsi:type="ns2:Map"><item><key xsi:type="xsd:string">noContrat</key><value xsi:type="xsd:string">FP00000000</value></item> 
<item><key xsi:type="xsd:string">acombaUidClient</key><value xsi:type="xsd:string">945</value></item><item><key xsi:type="xsd:string">name</key><value xsi:type="xsd:string">Test</value></item><item><key xsi:type="xsd:string">institution</key><value xsi:type="xsd:string">000</value></item><item><key xsi:type="xsd:string">folio</key><value xsi:type="xsd:string">000000</value></item><item><key xsi:type="xsd:string">transit</key><value xsi:type="xsd:string">00000</value></item><item><key xsi:type="xsd:string">zip</key><value xsi:type="xsd:string">XXX XXX</value></item><item><key xsi:type="xsd:string">adress</key><value xsi:type="xsd:string">2 testtown</value></item><item><key xsi:type="xsd:string">phone</key><value xsi:type="xsd:string"></value></item><item><key xsi:type="xsd:string">city</key><value xsi:type="xsd:string">Test</value></item></param0></ns1:saveClientAvenant> 
</SOAP-ENV:Body></SOAP-ENV:Envelope> 

    <?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:SOAP_AvenantAcomba" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<SOAP-ENV:Body><ns1:saveClientAvenantResponse><return xsi:type="ns2:Map"><item><key xsi:type="xsd:string">reponse</key><value xsi:type="xsd:boolean">true</value></item><item><key xsi:type="xsd:string">errorMessage</key><value xsi:type="xsd:string"></value></item></return></ns1:saveClientAvenantResponse> 
</SOAP-ENV:Body></SOAP-ENV:Envelop 

주의 사항 envelo PE는 제대로 모르는 ...이 폐쇄되지 않는 이유를 통해 ....

호출 :

$client = new SoapClient(null, array('location' => ACOMBA_WEB_SERVICE_Avenant, 
               'uri'    => "urn:SOAP_AvenantAcomba", 
               'trace'  => 1, 
               'encoding' => 'ISO-8859-1')); 

      $info = array($arraySOAP => array(
        'noContrat' => getNoContratTxt($contract->getCols('noContract')), 
        'acombaUidClient' => $contract->getCols('acombaUidClient'), 
        'name' => $contract->getCols('name') , 
        'institution' => $contract->getCols('noInstitution'), 
        'folio' => $contract->getCols('noFolio'), 
        'transit' => $contract->getCols('noTransit'), 
        'zip' => makeSQasDQ($contract->getCols('zipAddAssurer')), 
        'adress' => makeSQasDQ(utf8_decode($contract->getCols('noAddAssurer') . ' ' . $contract->getCols('streetAddAssurer'))), 
        'phone' => '', 
        'city' => makeSQasDQ(utf8_decode($contract->getCols('townAddAssurer')))) 
      ); 


     $resultClient = $client->__soapCall('saveClientAvenant', $info); // crash here 

서비스 :

<?php 
require_once('variables.php'); 

set_time_limit(900); 


function saveClientAvenant($arraySOAP){ 

    $conn = odbc_connect(ACOMBA_DRIVER, ACOMBA_USER, base64_decode(ACOMBA_PASS)); 

    if (odbc_commit($conn)) { 
     try { 
      $nxtContrat = $arraySOAP['noContrat']; 
      $nom = $arraySOAP['name']; 
      $noInstitution = $arraySOAP['institution']; 
      $noFolio = $arraySOAP['folio']; 
      $noTransit = $arraySOAP['transit']; 
      $zipCode = $arraySOAP['zip']; 
      $adress = $arraySOAP['adress']; 
      $phone = $arraySOAP['phone']; 
      $city = $arraySOAP['city']; 
      $acombaUidClient = $arraySOAP['acombaUidClient']; 

      $sqlQuery = "UPDATE " . TABLE_ACOMBA_CLIENT . " 
      SET 
      CuSortKey = '$nom', 
      CuName = '$nom', 
      CuAddress = '$adress', 
      CuCity = '$city', 
      CuPostalCode = '$zipCode', 
      CuPhoneNumber1 = '$phone', 
      CuInstitutionNumber = '$noInstitution', 
      CuBranchNumber = '$noTransit', 
      CuAccountNumber = '$noFolio' 
      WHERE 
      CuUnique = $acombaUidClient 
      "; 

      if (!odbc_exec($conn, $sqlQuery)) { 
       throw new Exception($sqlQuery . odbc_errormsg()); 
      } 
     } catch (Exception $e) { 
      return array('reponse' => false, 
       'errorMessage' => $e->getMessage()); 
     } 
     odbc_close($conn); 

     return array('reponse' => true, 
       'errorMessage' => ''); 
    } 
}  



$server = new SOAPServer(null, array('uri'   => 'urn:SOAP_AvenantAcomba', 
             'encoding' => 'ISO-8859-1')); 

$server->addFunction('saveClientAvenant'); 
$HTTP_RAW_POST_DATA = file_get_contents('php://input'); 
$server->handle(); 

?> 
+0

왜이 줄이 서버 스크립트에 있는지 궁금합니다 :'$ HTTP_RAW_POST_DATA = file_get_contents ('php : // input');'설명 할 수 있습니까? – Sven

+0

이 링크를 확인하면 내가 할 수있는 것보다 더 잘 설명됩니다. http://stackoverflow.com/questions/2731297/file-get-contentsphp-input-or-http-raw-post-data-which-one-is-better -to/2731338 # 2731338 –

+0

질문을 놓친 링크로 답장을 보내 주셔서 감사합니다. '$ HTTP_RAW_POST_DATA'는 슈퍼 글로벌이 아니기 때문에 왜 데이터를 넣은 다음 사용하지 않을까요? 이 변수는 [always_populate_raw_data] (http://de3.php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data)가 켜져있는 경우에만 채워집니다. 대답은 편의와 악의 혼합입니다! 'SoapServer :: handle()'은 데이터의 문자열을 받아들입니다. 아무 것도 전달되지 않으면'$ HTTP_RAW_POST_DATA'가 대신 사용됩니다. 이 줄은 config ini 설정을 잘못 수정합니다 : 내용을'$ var'에 넣고'handle ($ var)'에 대신 전달하십시오. – Sven

답변

0

당신이 변화 시도 유무 :

'encoding' => 'ISO-8859-1' 

에 :

'encoding'=>'UTF-8' 

? 그 내용과 약간 다른 콘텐츠 길이가 예상됩니다. 이는 내가 귀하의 문제로 생각하는 것입니다.

+0

방금 ​​시도, 나는 같은 결과를 얻을 ... –

+0

그게 너무 나쁘군요. 그것이 내 프로젝트라면 출력하기 전에 비누 - 서버가 출력 한 결과를 로깅 해보려고했다. 이것이 잘려나 간다면 서버 측 문제입니다. 그렇지 않은 경우, 클라이언트 측. –

0

우리 서버가 Brotli 압축을 사용하여 XML을 압축했을 때 에 이 없기 때문에 Brotli와 Soap이 잘 작동하지 않습니다.

관련 문제