Newsgroup: it.comp.www.php
Titolo: Problemi Soap con .net

devo eseguire una funzione su un server esterno tramite una connessione
soap.
Ci sono purtroppo degli header da aggiungere.
il collegamento non mi funziona.
l'erroreche mi viene fornito dal loro sistema è il seguente:
"errore convalida password"
Questo è l'xml che genera il mio client:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="
http://schemas.xmlsoap.org/soap/envelope/
"
xmlns:ns1="WSAgenzie.Web">
        <SOAP-ENV:Header>
                <ns1:Authenticator>
                        <UserName>XXXXXXX</UserName>
                        <Password>XXXXXXX</Password>
                </ns1:Authenticator>
        </SOAP-ENV:Header>
        <SOAP-ENV:Body>
                <ns1:RicercaDatiAgenzia>
                        <ns1:email>XXXXXX</ns1:email>
                </ns1:RicercaDatiAgenzia>
        </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Il loro client genera invece un xml di questo tipo:
<soapenv:Envelope xmlns:soapenv="
http://schemas.xmlsoap.org/soap/envelope/
">
        <soapenv:Header>
              <tns:Authenticator
                xmlns:soapenc="
http://schemas.xmlsoap.org/soap/encoding/
"
                xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
"
                xmlns:tns="WSAgenzie.Web" xmlns:xsd="
http://www.w3.org/2001/XMLSchema
">
                  <tns:UserName>testgabetti</tns:UserName>
                  <tns:Password>testgabetti</tns:Password>
              </tns:Authenticator>
        </soapenv:Header>
        <soapenv:Body>
              <tns:RicercaDatiAgenzia
                xmlns:soapenc="
http://schemas.xmlsoap.org/soap/encoding/
"
                xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
"
                xmlns:tns="WSAgenzie.Web" xmlns:xsd="
http://www.w3.org/2001/XMLSchema
">
                  <tns:email>
bol...@gabetti.it
</tns:email>
              </tns:RicercaDatiAgenzia>
        </soapenv:Body>
</soapenv:Envelope>
il codice che uso io è così:
<?php
class ProvaSoap
{
    private $user,$passwd,$soap,$debug;
    public $name_space = "WSAgenzie.Web";
    function __construct($indirizzo,$user,$passwd,$debug = false){
        $this->user = $user;
        $this->passwd = $passwd;
        $this->debug = $debug;
        if ($debug)
          $this->soap = new SoapClient($indirizzo,array(
              "trace"      => 1,
              "exceptions" => 0));
        else
          $this->soap = new SoapClient($indirizzo);
        $this->build_auth_header();
    }
    private function build_auth_header(){
        $auth->UserName = $this->user;
        $auth->Password = $this->passwd;
        $authvalues = new SoapVar($auth, SOAP_ENC_OBJECT);
        $header =  new SoapHeader($this->name_space, "Authenticator",
$authvalues, false);
        $this->soap->__setSoapHeaders(array($header));
    }
    // Wrapper so we can build auth header first
    public function RicercaDatiAgenzia($email){
        $risultato = $this->soap->RicercaDatiAgenzia($email);
        if ($this->debug) {
            print "<pre>\n";
            print "Richiesta :\n".str_replace("&gt;","&gt
\n",htmlspecialchars($this->soap->__getLastRequest()))."\n\n\n";
            print "Risposta:\n".str_replace("&gt;","&gt
\n",htmlspecialchars($this->soap->__getLastResponse()))."\n";
            print "</pre>";
        }
        return $risultato;
    }
}
$client = new ProvaSoap("
http://XXXXXXXXXXXXXXXXX
",'test','test',true);
try {
  $param["email"] = "
pr...@prova.it
";
  $client->RicercaDatiAgenzia($param);
} catch (SoapFault $exception) {
  echo $exception;
}

"errore convalida password"
Be', io da tempo ho concluso di non essere capace di usare il SOAP (Simple
Object Access Protocol). E' facile, semplice, giovane, dinamico, ci riesce
chiunque... io no. Oh: se uno non e' buono, non e' buono.
Percio', di solito utilizzo COAP (Complicated Object Access Protocol), che
consiste nel costruirmi l'XML che mi serve usando un "here document" e poi
spedirlo via POST con cURL. Se necessario, falsifico l'User-Agent cosi' da
far sembrare che io stia usando $LATEST_FASHION_TOOL [1].
Tanto il protocollo e' cosi' semplice che mi pare ognuno abbia il proprio,
per cui, per farsi intendere usando questo sistema universale, la gente e'
costretta a fornire pacchetti di esempio proprio come ai tempi dei formati
proprietari [2]. Non faccio altro che copiarli per sostituire quelle due o
tre variabili importanti in mezzo al casino dell'altra roba.
Nel tuo caso quindi scriverei
	$xml = <<<XMLPACKET
<soapenv:Envelope
xmlns:soapenv="
http://schemas.xmlsoap.org/soap/envelope/
">
        <soapenv:Header>
              <tns:Authenticator
                xmlns:soapenc="
http://schemas.xmlsoap.org/soap/encoding/
"
                xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
"
                xmlns:tns="WSAgenzie.Web"
xmlns:xsd="
http://www.w3.org/2001/XMLSchema
">
                  <tns:UserName>$username</tns:UserName>
                  <tns:Password>$password</tns:Password>
              </tns:Authenticator>
        </soapenv:Header>
        <soapenv:Body>
	<!-- resto della fuffa e variabile $email ... -->
</soapenv:Envelope>
XMLPACKET;
	$result = SendCOAP($xml); /* wrapper per curl request */
(Per il parsing delle risposte uso regexp o XML, secondo cosa capita).
Mi rendo conto di non essere una persona seria: non devo installare kilate
di librerie, so sempre cosa sto generando e quando mi mandano un pacchetto
di esempio "che a noi funziona" posso replicarlo in 20 secondi netti, pare
quasi che io l'abbia copincollato ]:-), e funziona sempre alla prima.
Cosi', se proprio arrivi alla disperazione, una via d'uscita ce l'hai.
Leonardo cinico
[1]  Finora non m'hanno mai scoperto... anzi, una volta ho riscosso grande
     ammirazione perche', sullo stesso server, usavo _due_ diversi toolkit
     completamente incompatibili l'uno con l'altro e nessuno capiva in che
     modo fossi riuscito a farli andare d'accordo.
[2]  Ogni tanto ho il dubbio di non essere il solo, ad aver trovato questa
     astuta scorciatoia. Anzi certe volte mi domando se non facciano tutti
     cosi', lasciando i vari toolkit perche' ci si scornino i niubbi.
-- 
 What do you make, so fair and bright;
 What do you build with sails for flight;
 What do you weave with wool so white?

 
Lo uso anche io sinceramente trovo che a volte si fa prima.
ma quando c'e' in ballo un wsdl in teoria le cose dovrebbero andare lisce.
In questo caso non potevo, perchè ho un poliziotto che mi controlla il
codice, comunque ho trovato la banalissima soluzione:
$authvalues = new SoapVar($auth, SOAP_ENC_OBJECT,"Authenticator"
$this->name_space);
invece di:
$authvalues = new SoapVar($auth, SOAP_ENC_OBJECT);
in pratica 
$header =  new SoapHeader($this->name_space, "Authenticator", $authvalues,
false);
non mi gatantiva l'esistenza del name space nei campi user e password