2013-07-19 104 views
0

編輯: 我設法通過要求服務器開發人員將字符串拆分爲數組在他身邊來解決這個問題。它現在有效。在.NET中工作,不能在PHP中工作? SOAP

無論如何,我從來沒有設法知道如何正確地將數組傳遞給.NET肥皂服務器。


我在PHP中有一個不工作的SOAP客戶端。服務器開發人員處理了一個可用的.NET示例。我在這裏粘貼。我錯過了什麼嗎?

問候

PHP代碼

$res = new cResult; 

//$oRequest = new InsertVenta; (throws the same error wether this is specified or not) 

$pcAccesorios = new cACC_VENTA; 

$oUSER = new cUSER; 
$oUSER->LOGIN = "hidden"; 
$oUSER->PASS = "hidden"; 
//$oUSER->ERROR = 0; 

$oAVISO = new cVENTA; 
$oAVISO->NOMBRE = str_pad($nombre, 150); 
$oAVISO->DIRECCION = str_pad($direccion, 250);  
$oAVISO->CP = str_pad($codpostal, 5);    
$oAVISO->POBLACION = str_pad($poblacion, 150);  
$oAVISO->PROVINCIA = str_pad($provincia, 75);  
$oAVISO->PERS_CONTACTO = str_pad($pers_contacto, 150); 
$oAVISO->TFNS_CONTACTO = str_pad($telefono, 50); 
$oAVISO->EMAIL = str_pad($email, 75); 
$oAVISO->NIF = str_pad($nifcif, 10); 
$oAVISO->ERROR = 0; 
//$oAVISO->HasError = 0; 
//$oAVISO->$ID_ORDEN = 0; 


$oRequest->oUSER = $oUSER;  
$oRequest->oAVISO = $oAVISO; 

$maxindex = count($listacompra); 
for ($i = 0 ; $i < $maxindex; $i++) { 
    $array_de_2 = explode(" ", $listacompra[$i]); 

    $pcAccesorios->REFERENCIA = $array_de_2[1]; 
    $pcAccesorios->UNIDADES = $array_de_2[0]; 

    $oRequest->oACC[$i] = $pcAccesorios; 
} 

//$oRequest->oACC = $oACC; 
//var_dump($oRequest); 

try { 
    $client = new SoapClient($wdsladdress, array("trace" => 1,"exceptions"=>0)); 
    //print $client->__getTypes(); 
    //var_dump($client->__getFunctions()); 
    //print "conectado  "; 
} catch (Exception $e) { 
echo '', $e->getMessage(), "\n"; 
die(); 
} 

try {    
    //$res=$client->INSERT_VENTA($oUSER, $oAVISO, $oACC); 

    $res=$client->INSERT_VENTA($oRequest); 
    //$client->__getLastRequest(); 
    //$res->INSERT_VENTAResult; 
    $ID_ORDEN=(string)$res->INSERT_VENTAResult->ID_ORDEN; 
    var_dump($ID_ORDEN); 
    print var_dump($res);        
} catch (Exception $e) { 
echo '', $e->getMessage(), "\n"; 
die(); 
} 

.NET代碼

Dim oAVISO As New WS_TSG.cVENTA 
oAVISO.CP = "24400" 
oAVISO.DIRECCION = "Mi direccion " 
oAVISO.EMAIL = "[email protected] " 
'oAVISO.ID_ORDEN = 
oAVISO.NIF = "A12345678 " 
oAVISO.NOMBRE = "Mi nombre " 
oAVISO.PERS_CONTACTO = "Anonimo Nadie " 
oAVISO.POBLACION = "Vega de la esquina " 
oAVISO.PROVINCIA = "Leon " 
oAVISO.TFNS_CONTACTO = "987343434 " 

Dim oACC As New WS_TSG.ArrayOfCACC_VENTA 
Dim oACC_VENTA As New WS_TSG.cACC_VENTA 

oACC_VENTA.REFERENCIA = "KITHDTV72" 
oACC_VENTA.UNIDADES = "1" 
oACC.Add(oACC_VENTA) 
oACC_VENTA.REFERENCIA = "USBTV82" 
oACC_VENTA.UNIDADES = "2" 
oACC.Add(oACC_VENTA) 
oACC_VENTA.REFERENCIA = "ACDCTV425" 
oACC_VENTA.UNIDADES = "1" 
oACC.Add(oACC_VENTA) 

oAVISO = WS.INSERT_VENTA(oUSER, oAVISO, oACC) 

的錯誤是:

服務器無法讀取請求。 ---> XML 文檔(2,280)中有錯誤。 --->輸入字符串格式不正確。

任何幫助?謝謝!

+0

檢查生成的文件,可能的命名空間的問題 – DevZer0

+0

我來的東西問題是我「如何」打發飾品陣列,我已經試過: - Withing的ARGS作爲數組:即:oRequest-> oACC [] < - 這是一個數組。 - 作爲一個對象,包含一個數組:即:oRequest-> oACC [] = ArrayOfAccesories –

回答

1

我已經有一些與.net和PHP之間的soap通信的問題。

對我來說,解決方案是使用Zend的肥皂和具體DOTNET的客戶端類:

首先在全部,使用ZendSoap組件(它只是圍繞着肥皂PHP的擴展名的包裝至極提供一些有用的功能和配置的東西) :http://framework.zend.com/manual/2.2/en/modules/zend.soap.client.html

特定的客戶端\ DOTNET類:

<?php 
use Zend\Soap\Client; 
$client = new Client\DotNet($wdsladdress, array("trace" => 1,"exceptions"=>0)); 
$client->method(); 

API文檔:http://framework.zend.com/apidoc/2.0/classes/Zend.Soap.Client.DotNet.html

+0

我已經有一些其他功能在該服務器上工作,這是我唯一遇到麻煩的一個。這也是唯一一個我必須把數組放入。我確信Zend改進了整體肥皂體驗,但我想保持項目內的一致性。我相信這可以解決。無論如何,謝謝,我不知道Zend(這裏n00b),我會給它一個閱讀。 –

+0

也許這個評論可以幫助你: http://www.php.net/manual/en/soapclient.soapcall.php#89308 – lilobase

+0

謝謝大家的意見。最後,我們必須以不同的方式進行工作。我正在考慮切換到現在的框架(Yii),因爲它似乎更「乾淨」地處理這類事情。 –

0

爲了使用\Zend\Soap\Client\DotNet您可能需要

  1. 使用setOptions(而不是傳遞選項的第二個參數)
  2. authentication和其他的東西在你的構造函數的$options
  3. 指定一個假的WSDL和將其作爲第一個參數傳入\Zend\Soap\Client\Common

    $url = 'https://WSURL.com/Something.asmx?wsdl'; 
    $options = [ 
        'authentication' => 'ntlm', 
        'login' => 'YOURLOGIN', 
        'password' => 'YOURPASS', 
        'wsdl' => $url', 
    ]; 
    $soap = new \Zend\Soap\Client\DotNet($url); 
    $soap->setOptions($options); 
    $uselessClient = new \Zend\Soap\Client\Common('anystring', 'FakeWsdl.xml', []); 
    $response = $soap->_doRequest($uselessClient, $fullXMLRequestBody, $urlOfRealWsdl, 'SoapMethodWeWantToUse', SOAP_1_1); 
    

注意更換$urlOfRealWsdl$fullXMLRequestBodySoapMethodWeWantToUse

所有這些都可以在瀏覽器(不帶?wsdl)中訪問您的ws url並點擊所需的方法時找到。