2010-07-28 7 views
2

J'ai rencontré un problème étrange en utilisant un client de service Web C# pour appeler un service Web ASP.NET 2.0. Le service est une recherche de produit simple et renvoie un tableau de produits correspondant à un terme de recherche - voir la partie pertinente du fichier WSDL ci-dessous.
Mon client C# est simplement généré en ajoutant une référence Web dans VS2010 (non-WCF) et à titre de comparaison, j'utilise un client Java Axis 1.4.
En utilisant les mêmes paramètres de recherche dans le client C# et le client Java, l'appel renvoie 50 produits mais dans le client C#, le tableau des résultats a une longueur de 1 tandis que le client Java affiche les 50 éléments corrects.Client de service Web Debug C#

Je cherche des suggestions comment trouver le problème - j'ai essayé ce qui suit:

  • Comparez le code XML retourné par le webservice en utilisant un moniteur TCP/IP: XML semble identique C# par rapport à Java et contient les 50 produits
  • Comparer les paramètres HTTP en utilisant netcat: C# par défaut à HTTP 1.1 tandis que l'Axe 1.4 utilise HTTP 1.0, mais changer le client C# pour utiliser HTTP 1.0 ne change rien
  • Essayez SOAP 1.2 au lieu de SOAP 1.1: Aucun effet
  • Essayez HttpGetPr otocol, HttpPostProtocol au lieu de savon

Toutes les suggestions sont très appréciées.


EDIT: WSDL complet et code généré (Reference.cs) se trouvent ici:
http://timmay.dk/Reference.txt
http://timmay.dk/Wsdl.txt

partie WSDL simplifié:

 <s:element name="Search"> 
    <s:complexType> 
     <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="SearchTerm" type="s:string" /> 
     <s:element minOccurs="0" maxOccurs="1" name="StartFrom" type="s:string" /> 
     <s:element minOccurs="0" maxOccurs="1" name="NumberToBeReturned" type="s:string" /> 
     </s:sequence> 
    </s:complexType> 
    </s:element> 
    <s:element name="SearchResponse"> 
    <s:complexType> 
     <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="SearchResult" type="tns:SearchResult" /> 
     </s:sequence> 
    </s:complexType> 
    </s:element> 
    <s:complexType name="SearchResult"> 
    <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="Products" type="tns:ArrayOfResponseProduct" /> 
    </s:sequence> 
    </s:complexType> 
    <s:complexType name="ArrayOfResponseProduct"> 
    <s:sequence> 
     <s:element minOccurs="0" maxOccurs="unbounded" name="ResponseProduct" nillable="true" type="tns:ResponseProduct" /> 
    </s:sequence> 
    </s:complexType> 
    <s:complexType name="ResponseProduct"> 
    <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="Fields" type="tns:ArrayOfResponseField" /> 
    </s:sequence> 
    <s:attribute name="id" type="s:string" /> 
    </s:complexType> 
+0

Comment le client C# récupère-t-il 50 produits avec seulement 1 élément de tableau? –

+0

Le tableau * devrait * avoir une longueur de 50 mais a une longueur de 1. En regardant le code XML dans le moniteur TCP/IP, je peux voir tous les 50 produits retournés par le service - le résultat analysé est le problème. – Tim

+0

Puisque les réponses évidentes ne vous aident pas, nous aurons besoin de regarder votre code généré, ou même un petit exemple de travail complet qui contient le bug (mais cela peut être un peu difficile dans cette situation). – Abel

Répondre

0

Il est avéré que le coupable était le type des valeurs de retour - champ Réponse

< s:complexType name="ResponseField"> 
    <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" /> 
     <s:element minOccurs="0" maxOccurs="1" name="Value"> 
     <s:complexType> 
      <s:sequence> 
      <s:element ref="s:schema" /> 
      <s:any /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
    </s:sequence> 
    </s:complexType> 

Ce défaut a été pr converti en un System.Data.DataSet - la modification de ce à une chaîne simple a résolu le problème. Il semble que l'unmarshalling a échoué dans ce cas.

0

Du WSDL je déduis que le maxOccurs est 1. Donc, il semble que vous devriez recevoir en effet un seul SearchResult. Toutefois, ce résultat doit contenir lui-même un objet de type ArrayOfReponseProduct, qui contient une quantité illimitée d'éléments ResponseProduct. Peut-être que vous ne cherchez pas assez profond?

Avez-vous essayé de vérifier à l'intérieur du débogueur avec les contrôleurs variables (Local, Auto, Immédiat, etc.)? L'objet est-il typé, ou non typé, auquel cas vous devrez peut-être le lancer en premier pour voir le contenu?

+0

C'est correct - vous recevez 1 objet SearchResult et celui-ci a le ArrayOfResponseProduct (SearchResult.Producst dans le code généré). Celui-ci a longueur 1 i le code C# et longueur 50 dans le code Java. Le débogueur affiche 1 élément comme le fait d'inviter la propriété Length du tableau. – Tim

+0

@Tim: et puis-je supposer que vous avez inspecté cet élément pour ne pas être un autre niveau d'un tableau ou d'un énumérateur, comme votre WSDL le suggère? – Abel

+0

Oui, cet élément est simplement un "ResponseProduct" qui consiste en un tableau de propriétés. Le XML ressemble à ceci: ... - chaque élément ResponseProduct a une liste de champs. La seule entrée dans le tableau de produits que je reçois a "id" 1330601 comme il le devrait selon le XML. Le débogage du client Java génère la même structure, juste avec ... 50 éléments dans le tableau Produits. – Tim