Scrittura di un client C# per utilizzare un servizio Web Java che restituisce una matrice di oggetti

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

  •  09-06-2019
  •  | 
  •  

Domanda

Sto scrivendo un client C# che chiama un servizio web scritto in Java (da un'altra persona).Ho aggiunto un riferimento web al mio cliente e riesco a chiamare i metodi nel servizio web ok.

Il servizio è stato modificato per restituire una serie di oggetti e il client non analizza correttamente il messaggio SOAP restituito.

MyResponse[] MyFunc(string p)

class MyResponse
{
    long id;
    string reason;
}

Quando il proxy C# generato chiama il servizio Web (utilizzando SoapHttpClientProtocol.Invoke), mi aspetto un array MyResponse[] con lunghezza pari a 1, ovvero un singolo elemento.Ciò che ottengo dopo la chiamata Invoke è un elemento con id=0 e Reason=null, indipendentemente da ciò che effettivamente restituisce il servizio.Utilizzando uno sniffer di pacchetti, posso vedere che il servizio sta restituendo quello che sembra essere un messaggio soap legittimo con ID e motivo impostati su valori non nulli.

Esiste qualche trucco per convincere un client C# a chiamare un servizio Web Java che restituisce someobject[] ?Lavorerò per ottenere una demo ripulita, se necessario.

Modificare:Questo è un riferimento web tramite "Aggiungi riferimento web...".CONTRO 2005, .NET 3.0.

È stato utile?

Soluzione

È passato un po' di tempo, ma mi sembra di ricordare di aver avuto problemi con le lievi differenze nel modo in cui venivano gestiti gli spazi dei nomi predefiniti tra i servizi Web .Net e Java.

Ricontrolla la classe proxy c# generata e tutti gli spazi dei nomi dichiarati all'interno (in particolare i valori predefiniti xmlns=""), rispetto a quanto previsto dal servizio Java.Probabilmente ci saranno differenze molto sottili che dovrai ricreare.

Se questo è il caso, dovrai fornire più dichiarazioni dello spazio dei nomi negli attributi C#.

Altri suggerimenti

Grazie a Xian, ho una soluzione.

Il wsdl per il servizio includeva una riga

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

Il soap che il client ha inviato al server aveva il seguente attributo su tutti gli elementi di dati:

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

Ma il payload xml della risposta (dal servizio al client) lo ha fatto non includere questo spazio dei nomi.Armeggiando con la risposta HTTP (che ho ottenuto con WireShark), ho osservato che la classe proxy .NET rilevava correttamente i valori MyResponse se forzavo l'attributo xmlns su ogni elemento dati restituito.

A meno di modificare il servizio, che non controllo, la soluzione alternativa è modificare la classe proxy generata da VS (ad esempio Reference.cs) e cercare righe come questa:

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

e commentare la riga dell'attributo XmlType.Ciò dirà al CLR di cercare gli elementi di risposta nello spazio dei nomi predefinito anziché in quello specificato nel wsdl.Devi rifarlo ogni volta che aggiorni il riferimento, ma almeno funziona.

Dalla tua domanda, sembra che il client funzionasse a un certo punto, quindi il servizio è stato modificato per restituire un array.Assicurati di rigenerare il proxy in modo che il messaggio SOAP restituito venga deserializzato sul client.Non era chiaro che tu l'avessi fatto, solo per essere sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top