2010-04-13 9 views
0

Je suis en train d'écrire une application Silverlight dans laquelle je veux appeler le service web PHP écrit en utilisant NuSOAP. voici le WSDL de webserviceProblème de communication avec nuSAP ​​Silverlight et PHP

 <?xml version="1.0" encoding="ISO-8859-1" ?> 
- <definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:currencywebservice" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:currencywebservice"> 
- <types> 
- <xsd:schema targetNamespace="urn:currencywebservice"> 
    <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> 
    <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" /> 
    </xsd:schema> 
    </types> 
    <message name="GetAllCurrenciesRequest" /> 
- <message name="GetAllCurrenciesResponse"> 
    <part name="return" type="xsd:string" /> 
    </message> 
- <portType name="currencywebservicePortType"> 
- <operation name="GetAllCurrencies"> 
    <documentation>Get all currencies available</documentation> 
    <input message="tns:GetAllCurrenciesRequest" /> 
    <output message="tns:GetAllCurrenciesResponse" /> 
    </operation> 
    </portType> 
- <binding name="currencywebserviceBinding" type="tns:currencywebservicePortType"> 
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> 
- <operation name="GetAllCurrencies"> 
    <soap:operation soapAction="urn:currencywebservice#GetAllCurrencies" style="rpc" /> 
- <input> 
    <soap:body use="literal" namespace="urn:currencywebservice" /> 
    </input> 
- <output> 
    <soap:body use="literal" namespace="urn:currencywebservice" /> 
    </output> 
    </operation> 
    </binding> 
- <service name="currencywebservice"> 
- <port name="currencywebservicePort" binding="tns:currencywebserviceBinding"> 
    <soap:address location="http://localhost/extras/currency/currencyservice.php" /> 
    </port> 
    </service> 
    </definitions> 

Quand j'appelle le webservice donne une exception

The content type text/html of response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly 

Le côté php de service est

<?php 
// Pull in the NuSOAP code 
require_once('../../lib/tools/nusoap/nusoap.php'); 

$ns = "urn:currencywebservice"; 
// Create the server instance 
$server = new soap_server(); 
// Initialize WSDL support 
$server->configureWSDL('currencywebservice', $ns); 
$server->xml_encoding = "utf-8"; 
$server->soap_defencoding = "utf-8"; 
$server->wsdl->schemaTargetNamespace = $ns; 

$server->register('GetAllCurrencies', 
array(), 
array('return' => 'xsd:string'), 
$ns, 
$ns."#GetAllCurrencies", 
'rpc', 
'literal', 
'Get all currencies available'); 

// Define the method as a PHP function 
function GetAllCurrencies() { 
     return "test return"; 
} 
// Use the request to (try to) invoke the service 
header('Content-Type: text/xml; charset=utf8'); 
$server->service($HTTP_RAW_POST_DATA); 
?> 

S'il vous plaît aidez-moi quel est ce problème ?

Répondre

0

Il semble que le client de service (Silverlight?) S'attend à ce que le résultat de l'appel de service soit text/xml avec un codage UTF-8, mais votre PHP le renvoie comme text/html. text/html est le type de contenu par défaut pour PHP sauf si vous spécifiez un type de contenu différent via la commande header.

Ainsi, vous pouvez essayer d'ajouter ce qui suit au début de votre fichier PHP/service:

header('Content-Type: text/xml'); 

peut aussi vouloir faire en sorte que l'encodage de texte est UTF-8.

+0

Merci pour votre aide jones! Je vais essayer si ça marche. –

+0

Maintenant, j'obtiens cette erreur "Version de message non reconnue." une idée? –

+0

Mettez à jour votre question initiale avec les mises à jour de code que vous avez faites. –

0

Veuillez utiliser le natif PHP SoapClient au lieu de nuSoap. C'est une relique du passé.

+0

Le problème est que toutes les instances de PHP n'ont pas installé/compilé le SoapClient natif. Je préfèrerais utiliser le framework Zend ou la bibliothèque SOAP PHP native mais je suis limité par la version disponible. Et pour diverses raisons, recompiler PHP n'est pas une option. Alors NuSOAP est le moindre de deux maux. – Kingsolmn

1

Dans la méthode du registre, essayez de mettre le paramètre '$ use' comme 'literal' au lieu de 'encoded'.

+0

laissez-moi vérifier si cela fonctionne? –