Écriture d'un client C # pour utiliser un service Web Java qui renvoie un tableau d'objets

StackOverflow https://stackoverflow.com/questions/64833

  •  09-06-2019
  •  | 
  •  

Question

J'écris un client C # qui appelle un service Web écrit en Java (par une autre personne). J'ai ajouté une référence Web à mon client et je peux appeler des méthodes du service Web ok.

Le service a été modifié pour renvoyer un tableau d'objets et le client n'analyse pas correctement le message SOAP renvoyé.

MyResponse[] MyFunc(string p)

class MyResponse
{
    long id;
    string reason;
}

Lorsque mon proxy C # généré appelle le service Web (à l'aide de SoapHttpClientProtocol.Invoke), j'attends un tableau MyResponse [] d'une longueur de 1, c'est-à-dire un seul élément. Ce que je reçois après l'appel Invoke est un élément avec id = 0 et reason = null, indépendamment de ce que le service renvoie réellement. En utilisant un renifleur de paquets, je peux voir que le service renvoie ce qui semble être un message soap légitime avec un identifiant et un motif définis sur des valeurs non nulles.

Existe-t-il une astuce pour amener un client C # à appeler un service Web Java qui renvoie un objet []? Je travaillerai à obtenir une démo assainie si nécessaire.

Modifier : il s'agit d'une référence Web via la commande "Ajouter une référence Web ...". VS 2005, .NET 3.0.

Était-ce utile?

La solution

Cela fait un moment, mais je me souviens bien d'avoir eu des problèmes avec les légères différences dans la gestion des espaces de noms par défaut entre les services Web .Net et Java.

Revérifiez la classe de proxy c # générée et tous les espaces de noms déclarés à l'intérieur (en particulier les valeurs par défaut xmlns = "")" par rapport aux attentes du service Java. Il y aura probablement des différences très subtiles que vous devrez recréer.

Si tel est le cas, vous devrez fournir davantage de déclarations d'espaces de noms dans les attributs c #.

Autres conseils

Grâce à Xian, j'ai une solution.

Le WSDL pour le service inclus une ligne

<import namespace="http://mynamespace.company.com"/>

Le feuillet envoyé par le client au serveur avait l'attribut suivant sur tous les éléments de données:

xmlns="http://mynamespace.company.com"

Mais la charge XML de la réponse (du service au client) n'a pas l'inclusion de cet espace de noms. En bricolant avec la réponse HTTP (obtenue avec WireShark ), j'ai constaté que la classe de proxy .NET prenait correctement les valeurs de MyResponse si je forçais l'attribut xmlns à chaque élément de données renvoyé.

À part la modification du service, que je ne contrôle pas, la solution consiste à modifier la classe de proxy générée par le VS (par exemple, Reference.cs) et à rechercher des lignes comme celle-ci:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mynamespace.company.com")]
public partial class MyResponse {

et commentez la ligne d'attribut XmlType. Cela indiquera au CLR de rechercher des éléments de réponse dans l'espace de nom par défaut plutôt que celui spécifié dans le fichier wsdl. Vous devez le refaire chaque fois que vous mettez à jour la référence, mais au moins cela fonctionne.

D'après votre question, il semblerait que le client travaille à un moment donné, puis le service a été modifié pour renvoyer un tableau. Assurez-vous de générer à nouveau le proxy afin que le message SOAP renvoyé soit désérialisé sur le client. Ce n’était pas clair que vous ayez fait cela - assurez-vous simplement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top