2009-12-22 9 views
1

J'essaye de créer un WSDL pour un service Web préexistant. J'ai un client existant et un serveur existant, et j'ai capturé le format les deux utilisent en utilisant Wireshark. J'essaie d'écrire un nouveau client qui utilise le même format. Par conséquent, j'essaie de faire correspondre le format aussi étroitement que possible, que ce soit correct ou non. Je prépare un fichier WSDL en utilisant XmlSPY, que j'espère ensuite utiliser en C# et générer du code d'interface.Comment est-ce que je peux changer le préfixe d'espace de noms dans ce WSDL?

Voici mon WSDL jusqu'à présent:

<?xml version="1.0" encoding="UTF-8"?> 
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.ecerami.com/wsdl/HelloService.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ecerami.com/wsdl/HelloService.wsdl" name="HelloService"> 
<message name="api:create"/> 
<message name="oanda:create"> 
    <part name="parameter"/> 
    <part name="parameter"/> 
</message> 
<portType name="Oanda_PortType"> 
    <operation name="create"> 
    <input message="tns:oanda:create"/> 
    <output message="tns:api:create"/> 
    </operation> 
</portType> 
<binding name="Oanda_binding" type="tns:Oanda_PortType"> 
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <operation name="create"> 
    <soap:operation soapAction="sayHello"/> 
    <input> 
    <soap:body use="encoded" namespace="oanda.fxtrade.api"/> 
    </input> 
    <output> 
    <soap:body use="encoded" namespace="oanda.fxtrade.api"/> 
    </output> 
    </operation> 
</binding> 
<service name="Oanda_service"> 
    <documentation>WSDL File for Oanda FX Trade API (local SOAP server)</documentation> 
    <port name="Oanda_port" binding="tns:Oanda_binding"> 
    <soap:address location="http://10.0.0.3:18081"/> 
    </port> 
</service> 
</definitions> 

Voici un exemple de message que je suis en train de copier. C'est ce que le client d'origine émet:

<?xml version="1.0"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
    <oanda:create xmlns:oanda="oanda.fxtrade.api"> 
     <parameter>FXGAME</parameter> 
     <parameter></parameter> 
    </oanda:create> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Voici ce que XMLSpy dit que mon WSDL émettra pour le même message:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SOAP-ENV:Body> 
     <m:create xmlns:m="oanda.fxtrade.api"> 
     <parameter/> 
     <parameter/> 
     </m:create> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 

Ma question est maintenant - match HOW-je le « oanda: "préfixe généré par le client d'origine? Est-ce ce qu'on appelle un préfixe d'espace de noms? D'où vient le "m:" dans mon code généré? Je peux trouver des mentions de ceci dans d'autres exemples sur ce site, mais aucun utilisant WSDL, au moins autant que je peux dire.

Nous vous remercions de votre aide. Lorsque j'essaie d'exécuter le fichier WSDL ci-dessus via svcutil.exe, j'obtiens deux problèmes. 1) le code XML n'est pas bien formé puisque vous ne pouvez pas avoir plus d'un paramètre avec le même nom. XMLSpy se plaignait aussi de cela, alors je l'ai mis en garde pour le moment en les renommant Parameter1 et Parameter2.

L'erreur spécifique est: "Plus d'une partie de message nommée 'paramètre' a été spécifiée Chaque partie de message doit avoir un nom unique."

2) Une fois passé, je reçois cette erreur:

"préfixe Namespace 'tns: oanda' est pas défini."

Donc, encore une fois: Comment modifier/ajouter une définition d'espace de noms dans un fichier WSDL?

Répondre

4

Le préfixe d'espace de noms n'a pas d'importance. Les deux exemples sont identiques par les règles de XML.

+0

Cela peut être vrai, mais je J'aimerais toujours changer le préfixe de l'espace de noms. Sûrement il y a un moyen de le contrôler, oui? –

1

Les préfixes d'espace de noms sont exactement comme les noms de variables. Vous pouvez alias l'espace de noms avec ce que vous souhaitez.

Ceci est analogue au code java suivant:

Dans la première XML: api.fxtrade.onada onada;
Dans le second fichier XML: api.fxtrade.onada m;

En d'autres termes, le 1er XML peut être lu comme:
se référant à l'espace de noms « oanda.fxtrade.api » avec la variable onada, la balise create dans l'espace de noms onada, aura un paramètre de valeur FXGame.
Le deuxième XML peut être lu comme:
se référant à l'espace de noms « oanda.fxtrade.api » avec la variable m, la balise create dans l'espace de noms m, aura un paramètre ...