2010-07-27 20 views
1

J'ai un service web qui a une méthode avec un paramètre de type Collection (of Byte). Lorsque j'essaie de générer le proxy à l'aide de la commande wsdl, le type de données est converti en un tableau d'octets à une dimension. J'ai donc pensé à créer le fichier wsdl qui aura le type Collection (de byte) en utilisant Add comme référence de service, mais même si je spécifie le type de collection comme Collection.objectModel, le paramètre a toujours le type de données comme tableau unidimensionnel. des octets.Impossible de générer le fichier wsdl avec des méthodes ayant le type Datatype de collection générique.

Y at-il un moyen de le faire, ou manuel dois-je changer dans le fichier proxy.

Répondre

0

Vous devez spécifier le type de collection:

svcutil/t: Code /ct:System.Collections.Generic.List`1

Full SvcUtil documentation here.

+0

J'ai essayé que l'utilisation Ajouter un service de référence dans l'option avancée, mais toujours en WDSL le type de données est représenté comme tns: ArrayOfBase64Binary donc quand un proxy est créé, il est créé comme un tableau de Bytes au lieu de Collection (of Byte) – kurozakura

+0

Le WSDL montrera toujours un ArrayOfWhatever, comme les types génériques ne sont pas un concept qui peut être représenté avec XSD et WSDL. Lorsque vous générez du code à partir d'un WSDL, vous pouvez choisir de générer des tableaux, Liste , etc. – jrista

+0

On dirait que c'est par conception dans le cas de webservice. – kurozakura

0

J'ai également créé un service web dans lequel une méthode retourne un tableau de collection d'octets. Je joins un exemple de code et son wsdl généré. Espérons que cela peut vous aider à

public byte[][] GetPDFs(String searchQuery) 
    { 
List<Byte[]> list = new List<byte[]>(); 
// DO YOUR WORK 
return list.ToArray(); 
} 

et genetated wsdl:type dans wsdl est

<wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://TDS.elixir.com/"> 
     <s:element name="GetPDFs"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="searchQuery" type="s:string" /> 
      </s:sequence> 
     </s:complexType> 

     </s:element> 
     <s:element name="GetPDFsResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="GetPDFsResult" type="tns:ArrayOfBase64Binary" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:complexType name="ArrayOfBase64Binary"> 

     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="unbounded" name="base64Binary" nillable="true" type="s:base64Binary" /> 
     </s:sequence> 
     </s:complexType> 
    </s:schema> 
    </wsdl:types> 

et code généré par proxy (wsdl.exe ou en utilisant ajouter une référence) est comme:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetPDFs", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] 
    public byte[][] GetPDFs(string searchQuery) { 
     object[] results = this.Invoke("GetPDFs", new object[] { 
        searchQuery}); 
     return ((byte[][])(results[0])); 
    } 

S'il vous plaît laissez-moi savoir si vous avez besoin d'aide supplémentaire.