2013-07-19 110 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并点击所需的方法时找到。