2009-12-14 7 views
1

J'ai un service web écrit en C++ en utilisant gSoap. L'une des méthodes de webservice estVS 2008 wsdl outil de conversion xsd: positiveInteger en chaîne

int HS__TBusinessComponentGetContents(xsd__positiveInteger pSession, 
xsd__positiveInteger pComponentType, 
xsd__string pPath, 
xsd__string pFilter, 
xsd__string pChangedAfter, 
xsd__positiveInteger pFlags, 
xsd__string &rResult); 

L'utilisation de ces typedefs:

typedef double     xsd__double; 
typedef wchar_t     *xsd__string; 
typedef bool      xsd__boolean; 
typedef int      xsd__int; 
typedef unsigned long long  xsd__positiveInteger; 
typedef wchar_t     *xsd__datetime; 

je produis un fichier WSDL à l'aide de cette définition qui a cette (bonne) partie:

Cependant, lorsque je génère une classe proxy à l'aide de Vis uel Studio 2008 outil de wsdl.exe pour créer une classe que je peux utiliser à partir de C#, la définition des méthodes ci-dessus est la suivante:

[System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:tango04-hydra-server", ResponseNamespace="urn:tango04-hydra-server")] 
    [return: System.Xml.Serialization.SoapElementAttribute("rResult")] 
    public string TBusinessComponentGetContents([System.Xml.Serialization.SoapElementAttribute(DataType="positiveInteger")] string pSession, [System.Xml.Serialization.SoapElementAttribute(DataType="positiveInteger")] string pComponentType, string pPath, string pFilter, string pChangedAfter, [System.Xml.Serialization.SoapElementAttribute(DataType="positiveInteger")] string pFlags) { 
     object[] results = this.Invoke("TBusinessComponentGetContents", new object[] { 
        pSession, 
        pComponentType, 
        pPath, 
        pFilter, 
        pChangedAfter, 
        pFlags}); 
     return ((string)(results[0])); 
} 

Le WSDL est la suivante:

<?xml version="1.0" encoding="UTF-8"?> 
<definitions name="Publisher" 
targetNamespace="http://127.0.0.1:18084/Publisher.wsdl" 
xmlns:tns="http://127.0.0.1:18084/Publisher.wsdl" 
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" 
xmlns:HS="urn:tango04-hydra-server" 
xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:MIME="http://schemas.xmlsoap.org/wsdl/mime/" 
xmlns:DIME="http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/" 
xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/" 
xmlns="http://schemas.xmlsoap.org/wsdl/"> 

<types> 

<schema targetNamespace="urn:tango04-hydra-server" 
    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" 
    xmlns:HS="urn:tango04-hydra-server" 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="unqualified" 
    attributeFormDefault="unqualified"> 
    <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> 
</schema> 

</types> 

<message name="SessionOpenRequest"> 
<part name="vCredentials" type="xsd:string"/> 
</message> 

<message name="SessionOpenResponse"> 
<part name="rResult" type="xsd:positiveInteger"/> 
</message> 

<message name="SessionCloseRequest"> 
<part name="rSession" type="xsd:positiveInteger"/> 
</message> 

<message name="SessionCloseResponse"> 
<part name="rResult" type="xsd:boolean"/> 
</message> 

<message name="SoapTestRequest"> 
</message> 

<message name="SoapTestResponse"> 
<part name="rResult" type="xsd:boolean"/> 
</message> 

<message name="TBusinessComponentGetContentsRequest"> 
<part name="pSession" type="xsd:positiveInteger"/> 
<part name="pComponentType" type="xsd:positiveInteger"/> 
<part name="pPath" type="xsd:string"/> 
<part name="pFilter" type="xsd:string"/> 
<part name="pChangedAfter" type="xsd:string"/> 
<part name="pFlags" type="xsd:positiveInteger"/> 
</message> 

<message name="TBusinessComponentGetContentsResponse"> 
<part name="rResult" type="xsd:string"/> 
</message> 

<portType name="PublisherPortType"> 
<operation name="SessionOpen"> 
    <documentation>Service definition of function HS__SessionOpen</documentation> 
    <input message="tns:SessionOpenRequest"/> 
    <output message="tns:SessionOpenResponse"/> 
</operation> 
<operation name="SessionClose"> 
    <documentation>Service definition of function HS__SessionClose</documentation> 
    <input message="tns:SessionCloseRequest"/> 
    <output message="tns:SessionCloseResponse"/> 
</operation> 
<operation name="SoapTest"> 
    <documentation>Service definition of function HS__SoapTest</documentation> 
    <input message="tns:SoapTestRequest"/> 
    <output message="tns:SoapTestResponse"/> 
</operation> 
<operation name="TBusinessComponentGetContents"> 
    <documentation>Service definition of function HS__TBusinessComponentGetContents</documentation> 
    <input message="tns:TBusinessComponentGetContentsRequest"/> 
    <output message="tns:TBusinessComponentGetContentsResponse"/> 
</operation> 
</portType> 

<binding name="Publisher" type="tns:PublisherPortType"> 
<SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
<operation name="SessionOpen"> 
    <SOAP:operation style="rpc" soapAction=""/> 
    <input> 
    <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </input> 
    <output> 
    <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </output> 
</operation> 
<operation name="SessionClose"> 
    <SOAP:operation style="rpc" soapAction=""/> 
    <input> 
    <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </input> 
    <output> 
    <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </output> 
</operation> 
<operation name="SoapTest"> 
    <SOAP:operation style="rpc" soapAction=""/> 
    <input> 
    <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </input> 
    <output> 
    <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </output> 
</operation> 
<operation name="TBusinessComponentGetContents"> 
    <SOAP:operation style="rpc" soapAction=""/> 
    <input> 
    <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </input> 
    <output> 
    <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </output> 
</operation> 
</binding> 

<service name="Publisher"> 
<documentation>Tango/04 Computing Group - Publisher </documentation> 
<port name="Publisher" binding="tns:Publisher"> 
    <SOAP:address location="http://127.0.0.1:18084"/> 
</port> 
</service> 

</definitions> 

Ma question est: pourquoi cela se passe-t-il? Les paramètres ne devraient-ils pas être des entiers, ou de longues valeurs longues au lieu de chaînes pour les paramètres qui dans le wsdl sont marqués comme xsd: positiveInteger? Qu'est-ce que je fais mal ici?

Merci!

+0

Il peut être utile de publier le fichier wsdl que vous utilisez pour générer la classe proxy C#. –

Répondre

0

Cela peut ne pas être ce que vous voulez voir, mais cela peut aider: Microsoft

Fondamentalement, ce qu'il vous donne sont les types de données .Net qui sont associés à chaque type de données xsd. Sur cette page, il montre positiveInteger comme une chaîne. Bref, en bref, il fait ce qu'il est censé faire. Si vous voulez vraiment un type de données numérique, vous pouvez peut-être envisager d'utiliser un type de données Unsigned au lieu d'un entier positif, si vous en avez besoin pour toujours être positif. Sinon, utilisez simplement un type de données xsd approprié qui fonctionnera pour vous. Comme il semble que vous avez le contrôle sur le service Web et wsdl en C++ cela ne devrait pas être trop difficile. Si ce n'est pas quelque chose que vous voulez faire, vous devrez probablement ajouter des vérifications logiques sur votre client C# pour vous assurer que vous envoyez un numéro. Comme tout se passe techniquement sur le fil en tant que chaîne XML, cela n'a pas d'importance tant que le service peut sérialiser correctement votre requête. Avoir ainsi des contrôles de données sur votre objet consommateur. D'un autre côté, quand j'ai eu besoin de développer des services dans le passé, nous avons toujours codé manuellement les contrats xsd/wsdl au lieu de laisser les outils les générer afin que nous sachions toujours exactement ce que nous obtiendrons. Je ne sais pas si c'est ce que vous avez fait, mais vous pourriez le faire aussi. Lorsque nous faisons cela, nous utilisons l'outil wsdl pour générer le proxy serveur et le proxy client afin que vous puissiez générer le côté serveur dans cpp et le client dans cs et ensuite remplir les tripes comme vous en avez besoin.

J'espère que cela vous aide.