2017-07-12 2 views
0

J'ai écrit un soapServer dans le projet php.Quand je soapCall avec php tout est Ok.But Quand une autre personne dans .net utilise mon WSDL, a une erreur. Quelle est la solution? J'ai joint erreur, WSDL, résultat SoupUi et functions.Thankful.enter image description ici.net ne peut pas utiliser mon soapServer

Error for .net

SoapUi error

c'est panel.wsdl

<?xml version="1.0" encoding="ISO-8859-1"?> 
<definitions 
     targetNamespace='urn:server' 
     xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:tns='urn:server' 
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns="http://schemas.xmlsoap.org/wsdl/"> 


<types> 
     <xsd:schema targetNamespace='urn:server' xmlns="urn:server"> 
      <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> 
      <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" /> 
      <xsd:complexType name="getActiveServicesResponse"> 
       <xsd:complexContent> 
        <xsd:restriction base="SOAP-ENC:Array"> 
         <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" minOccurs="1" maxOccurs="unbounded"/> 
        </xsd:restriction> 
       </xsd:complexContent> 
      </xsd:complexType> 
      <xsd:complexType name="getHistoryServicesResponse"> 
       <xsd:complexContent> 
        <xsd:restriction base="SOAP-ENC:Array"> 
         <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" minOccurs="1" maxOccurs="unbounded"/> 
        </xsd:restriction> 
       </xsd:complexContent> 
      </xsd:complexType> 
      <xsd:complexType name="getHistoryServicesAllResponse"> 
       <xsd:complexContent> 
        <xsd:restriction base="SOAP-ENC:Array"> 
         <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" minOccurs="1" maxOccurs="unbounded"/> 
        </xsd:restriction> 
       </xsd:complexContent> 
      </xsd:complexType> 
     </xsd:schema> 
    </types> 
    <message name="getActiveServicesRequest"> 
     <part name="username" type="xsd:string" /> 
     <part name="password" type="xsd:string" /> 
     <part name="mobileNum" type="xsd:string" /></message> 
    <message name="getActiveServicesResponse"> 
     <part name="services" type="tns:getActiveServicesResponse" /></message> 
    <message name="unsubscribeRequest"> 
     <part name="username" type="xsd:string" /> 
     <part name="password" type="xsd:string" /> 
     <part name="mobileNum" type="xsd:string" /> 
     <part name="serviceID" type="xsd:string" /></message> 
    <message name="unsubscribeResponse"> 
     <part name="result" /></message> 
    <message name="getHistoryServicesAllRequest"> 
     <part name="username" type="xsd:string" /> 
     <part name="password" type="xsd:string" /> 
     <part name="mobileNum" type="xsd:string" /> 
     <part name="FromDate" type="xsd:string" /> 
     <part name="ToDate" type="xsd:string" /></message> 
    <message name="getHistoryServicesAllResponse"> 
     <part name="history" type="tns:getHistoryServicesAllResponse" /></message> 
    <message name="getHistoryServicesRequest"> 
     <part name="username" type="xsd:string" /> 
     <part name="password" type="xsd:string" /> 
     <part name="mobileNum" type="xsd:string" /> 
     <part name="serviceID" type="xsd:string" /> 
     <part name="FromDate" type="xsd:string" /> 
     <part name="ToDate" type="xsd:string" /></message> 
    <message name="getHistoryServicesResponse"> 
     <part name="history" type="tns:getHistoryServicesResponse" /></message> 
    <portType name="iPanelPortType"> 
     <operation name="getActiveServices"> 
      <input message="tns:getActiveServicesRequest"/> 
      <output message="tns:getActiveServicesResponse"/> 
     </operation> 
     <operation name="unsubscribe"> 
      <input message="tns:unsubscribeRequest"/> 
      <output message="tns:unsubscribeResponse"/> 
     </operation> 
     <operation name="getHistoryServicesAll"> 
      <input message="tns:getHistoryServicesAllRequest"/> 
      <output message="tns:getHistoryServicesAllResponse"/> 
     </operation> 
     <operation name="getHistoryServices"> 
      <input message="tns:getHistoryServicesRequest"/> 
      <output message="tns:getHistoryServicesResponse"/> 
     </operation> 
    </portType> 
    <binding name="iPanelBinding" type="tns:iPanelPortType"> 
     <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <operation name="getActiveServices"> 
      <soap:operation soapAction="urn:server#getActiveServices" style="rpc"/> 
      <input><soap:body use="encoded" namespace="urn:server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input> 
      <output><soap:body use="encoded" namespace="urn:server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output> 
     </operation> 
     <operation name="unsubscribe"> 
      <soap:operation soapAction="urn:server#unsubscribe" style="rpc"/> 
      <input><soap:body use="encoded" namespace="urn:server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input> 
      <output><soap:body use="encoded" namespace="urn:server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output> 
     </operation> 
     <operation name="getHistoryServicesAll"> 
      <soap:operation soapAction="urn:server#getHistoryServicesAll" style="rpc"/> 
      <input><soap:body use="encoded" namespace="urn:server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input> 
      <output><soap:body use="encoded" namespace="urn:server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output> 
     </operation> 
     <operation name="getHistoryServices"> 
      <soap:operation soapAction="urn:server#getActiveServices" style="rpc"/> 
      <input><soap:body use="encoded" namespace="urn:server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input> 
      <output><soap:body use="encoded" namespace="urn:server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output> 
     </operation> 
    </binding> 
    <service name="iPanel"> 
     <port name="iPanelPort" binding="tns:iPanelBinding"> 
      <soap:address location="http://37.130.202.161/integratedPanel?wsdl"/> 
     </port> 
    </service> 
</definitions> 

fonctions

<?php 
namespace App\Http\Controllers; 
use Illuminate\Http\Request; 
use Exception; 
use App\Notification; 
use App\LogNotification; 
use Log; 
class ServiceBinding extends Controller 
{ 

    public function getActiveServices($username,$password,$mobilNum) 
    { 
return "hello"; 
    } 

    public function unsubscribe($username,$password,$mobilNum,$serviceID) 
    { 
return "hello"; 
    } 

    public function getHistoryServicesAll($username,$password,$mobilNum,$toDate,$fromDate) 
    { 
return "hello"; 
    } 

    public function getHistoryServices($username,$password,$mobilNum,$serviceID,$toDate,$fromDate) 
    { 
return "hello"; 
    } 
} 
?> 

soap action

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use Exception; 
use Log; 

class IntegratedPanelController extends Controller 
{ 

    public function soap() { 

     try{ 
      ini_set('soap.wsdl_cache_enabled', 0); 
      ini_set('soap.wsdl_cache_ttl', '0'); 

      $server = new \SoapServer('/home/sysadmin/VAS_mci/public/wsdl/panel.wsdl', array('cache_wsdl' => WSDL_CACHE_NONE)); 
      $server->setClass("App\Http\Controllers\ServiceBinding"); 
      try { 
       $server->handle(); 
      } 
      catch (Exception $e) { 
       echo 'IntegratedPanelController.........'. $e->getMessage(); 
       log::info($e->getMessage()); 
       $server->fault('Sender', $e->getMessage()); 
      } 
//   echo "SOAP Server started"; 
     } 
     catch (Exception $exception){ 
      echo 'IntegratedPanelController.........'.$exception->getMessage(); 
      log::info($exception->getMessage()); 
      return $exception->getMessage(); 
     } 
    } 


} 

Répondre

0

Les bonnes choses à propos des normes sont qu'il y en a tellement à choisir. .Net et Java ont tous des standards différents en ce qui concerne XML. Comme XML est flexible, il est facile de créer une nouvelle norme même. Un qui est incompatible avec d'autres normes.

Votre WSDL n'est pas compatible WSI, il n'y a donc aucune garantie qu'il fonctionne dans tout ce qui est en dehors de votre boîte à outils. WSI est standard pour XML et comment il est représenté dans les appels SOAP, donc si vous voulez que votre service fonctionne avec tout ce dont vous avez besoin pour vous assurer que WSI se plaint.

J'ai exécuté le test de conformité WSI dans l'interface utilisateur SOAP et il a échoué. En outre, vous utilisez des appels de type RPC qui est dans certaines opinions périmées. Nous devons donc nous assurer que nos fichiers WSDL sont compatibles WSI autant que possible pour éviter les maux de tête tels que celui-ci.

Un exemple simple clarifierait pourquoi nous le faisons. Le concept null en programmation est que null est indéfini, il n'a pas de valeur. Comment puis-je spécifier NO VALUE en XML?

Supposons que nous ayons un client XML qui n'a qu'un nom. Comment puis-je spécifier une valeur NULL Name? Je pouvais faire une des opérations suivantes:

Exemple 1:

<customer> 
    <name/> 
</customer> 

Exemple 2:

<customer/> 

Exemple 3:

<customer> 
    <name nullable="true" /> 
</customer> 

Comme vous pouvez le voir ici, nous avons trois normes de représentation NULL en XML qui est correct? Ils ont tous raison d'une certaine manière. Cela dépend de la façon dont vous l'interprétez.

Une chose très étrange est la façon dont vous avez défini vos tableaux. Quand j'ai ouvert votre WSDL en studio XML liquide les lignes suivantes où invalides:

<xsd:complexType name="getHistoryServicesResponse"> 
      <xsd:complexContent> 
       <xsd:restriction base="SOAP-ENC:Array"> 
        <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" maxOccurs="unbounded"/> 
       </xsd:restriction> 
      </xsd:complexContent> 
     </xsd:complexType> 

Cela génère les erreurs suivantes:

(15:9) Critical The 'maxOccurs' attribute is not supported in this context. 
(15:9) Critical The 'minOccurs' attribute is not supported in this context. 

J'ai enlevé min et occurrences max puis je frappe une autre erreur.Celui-ci contenait ce que le principal problème était:

Schema Error Undefined complexType 'http://schemas.xmlsoap.org/soap/encoding/:Array' is used as a base for complex type restriction. 

Fondamentalement, la façon dont votre définissez votre WSDL en PHP valide pour n'est pas valable pour d'autres langues telles que .Net ou Java. Le problème est dans la façon dont vous définissez vos tableaux. Cette question vous montrera plus Error Consuming a RPC/Encoded SOAP web service in .NET. Je réalise que ce n'est pas la réponse que vous cherchez, mais j'espère que cela vous aidera à résoudre le problème.