编辑: 我设法通过要求服务器开发人员将字符串拆分为他身边的数组来解决这个问题。它现在有效。
无论如何,我从未设法知道如何正确地将数组传递给.NET soap服务器。
我在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@servidor.com "
'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)
错误是:
服务器无法读取请求。 ---&GT; XML中存在错误 文件(2,280)。 ---&GT;输入字符串的格式不正确。
有任何帮助吗?谢谢!
答案 0 :(得分:1)
我在.net和PHP之间的SOAP通信方面已经存在一些问题。
对我来说,解决方案是使用Zend Soap和特定的DotNet客户端类:
首先,使用ZendSoap组件(它只是一个围绕Soap 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 doc:http://framework.zend.com/apidoc/2.0/classes/Zend.Soap.Client.DotNet.html
答案 1 :(得分:0)
要使用\Zend\Soap\Client\DotNet
,您可能需要
authentication
的构造函数$options
和其他内容
指定假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
,$fullXMLRequestBody
和SoapMethodWeWantToUse
。
在浏览器中访问您的ws url(没有?wsdl)并单击所需的方法时,可以找到所有这些。