2010-12-28 11 views

risposta

0

L'unico motivo per cui posso pensare è un disallineamento del contratto. Anche se è strano se non viene lanciato nessun errore di validazione. Stai utilizzando un client generato dal WSDL corretto? È un client WCF o SOAP? La prima è convalidata, ne sono sicuro, ma i disallineamenti dello schema potrebbero scivolare nel secondo.

+0

Si verifica quando si genera la classe proxy dallo strumento wsdl e quando viene aggiunta come riferimento di servizio tramite la GUI VS2010. Questo è un client SOAP. – Sean

+0

Usa svcutil.exe, non wsdl.exe. O semplicemente utilizzare "Aggiungi riferimento servizio" e puntare all'endpoint WSDL o metadati. –

+0

Ho esattamente lo stesso problema di questo: gli spazi dei nomi che vedo nella risposta WSDL e XML (in Fiddler) sono esattamente gli stessi. Anche utilizzando un client SOAP. L'oggetto risposta è un semplice wrapper attorno a un array generico (dal server (Java) che è annotato con @XmlElementRefs ({@ XmlElementRef (type = Class1.class, ...}) l'XML passato a il client C# sembra corretto come: ... ... ..... C# crea l'oggetto risposta ma non riesce a popolare l'array ... – earcam

4

"La risposta è nulla" o "La risposta contiene valori null" o "La richiesta è nulla" o "La richiesta contiene valori null" significa quasi sempre che si verifica una mancata corrispondenza di spazio dei nomi. Ad esempio, la risposta può contenere:

<response xmlns="http://foo.com"/> 

ma dovrebbe essere infatti

<response xmlns="http://bar.com"/> 

In questo caso, saranno ricevuti nullo.

+0

SÌ ! Grazie – mikey

0

Ogni volta che ciò accade a me, è perché ho bisogno di aggiornare i miei riferimenti di servizio. Prova quello e fammi sapere cosa succede :)

+0

grazie per la risposta, ma fidati di me, ho cancellato e ricreato circa mille volte = ( Tuttavia è possibile che mi manchi qualcosa di ugualmente semplice o sto facendo uno stupido errore da qualche altra parte (la mia prima app C#) Ho provato con VS 2010 e SharpDevelop, tutto inutilmente ... – earcam

+0

Ok, lo apprezzerei da quando hai chiesto la domanda se potessi farlo ancora una volta, per favore. Cioè aggiornare il riferimento del servizio, piuttosto che eliminare e ricreare. Supponendo che non funzioni, sarebbe ideale vedere la definizione/contratto per l'oggetto (s) e il metodo coinvolto :) –

+0

Ho aggiornato in SharpDevelop ed era lo stesso di prima. Quando ho aggiornato il riferimento per i servizi Web in VS Express 2010, ho modificato lo spazio dei nomi C# che prefiggeva lo spazio dei nomi predefinito del progetto al riferimento del servizio (come DefaultNamespace.ServiceReference). L'esecuzione da entrambi i risultati IDE nello stesso oggetto risposta con campi null. – earcam

0

Risolto esso ... o almeno hanno soluzione. Nel codice Java, @XmlElementRefs e @XmlElementRef avrebbero dovuto essere rispettivamente @XmlElements e @XmlElement (oltre all'attributo "type" era necessario un attributo "nome").

Indovinando se avessi postato questa come una nuova domanda con un tag Java e C# e servizi web, uno stackoverflower con gli occhi spalancati avrebbe individuato questo errore scolastico.

0

Ho avuto un problema simile che ho risolto controllando il valore dell'ordine in Reference.cs. [System.Xml.Serialization.XmlElementAttribute (Order = 0)]

L'ordine dei parametri di ritorno era cambiata ma aggiornare il mio riferimento al servizio in Visual Studio non ha modificato il valore "Ordine".

Verificare che i parametri restituiti in Fiddler/SoapUI siano gli stessi della classe generata da proxy.

0

Ho avuto un caso simile in cui ho creato un client tramite SVCUTIL/Service Reference di VS. La risposta è stata ricevuta correttamente con dati corretti (confermata tramite il metodo IClientMessageInspector.AfterReceiveReply) tuttavia i valori a livello di oggetto non venivano popolati. Non ci sono stati errori di de-serializzazione (confermati tramite l'uscita system.diagnostics)

Il problema era duplice:

1) Alcuni oggetti sono stati nominati esattamente come i loro tipi, ma aveva spazi dei nomi diversi dai loro tipi. Questo sembra aver confuso il generatore di proxy nell'assegnazione del parametro namespace (nell'annotazione System.Xml.Serialization.XmlElementAttribute) della classe a quello dell'oggetto

2) Il parametro dell'ordine (in System.Xml. Serialization.XmlElementAttribute annotazione) delle proprietà non è stata richiesta e anche il parametro namespace mancava

in modo da: [System.Xml.Serialization.XmlElementAttribute (IsNullable = true, ordine = 0)]

a: [ System.Xml.Serialization.XmlElementAttribute (IsNullable = true, Namespace = "http: //www.whathevernamespaceiscorrect.com ")]

Fondamentalmente, nel proxy generato avevo bisogno di correggere lo spazio dei nomi della classe su quello specificato nel tipo e sostituire il parametro di ordine con il parametro namespace impostandolo nello spazio dei nomi corretto in base al wsdl

1

ho avuto lo stesso problema, e come suggerito il problema dello spazio dei nomi è stata la cause.However radice, la mia classe proxy è annidato classi e lunga catena di namespace nidificato.

era confusa per identificare lo spazio dei nomi corretto si applica in codice Cs per la classe proxy. Qui, descrivo come capire lo spazio dei nomi che è necessario aggiornare nel proxy client.

Quello che ho fatto è stato intercettare la richiesta nella classe ClientMessageInspector, metodo AfterReceiveReply (Abilita l'ispezione o la modifica di un messaggio dopo che è stato ricevuto un messaggio di risposta ma prima di passarlo all'applicazione client.) Verificato lo spazio dei nomi dell'oggetto che erano restituendo null in Response usando XMLDocument. Ho aggiornato la classe proxy con lo spazio dei nomi ripreso da XML. Dopo aver apportato le modifiche, gli oggetti non erano nulli in risposta.

public class MyMessageInspector : IClientMessageInspector 
{ 
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message request, object correlationState) 
    { 

     MemoryStream ms = new MemoryStream(); 
     XmlWriter writer = XmlWriter.Create(ms); 
     request.WriteMessage(writer); 

     writer.Flush(); 
     ms.Position = 0; 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(ms); 
     this.ReadMessage(xmlDoc); 


     ms = new MemoryStream(); 
     xmlDoc.Save(ms); 
     ms.Position = 0; 
     XmlReader reader = XmlReader.Create(ms); 
     Message newMessage = Message.CreateMessage(reader, int.MaxValue, request.Version); 
     newMessage.Properties.CopyProperties(request.Properties); 
     request = newMessage; 

    } 

    private void ReadMessage(XmlDocument xmlDoc) 
    { 
     XmlNode v1 = xmlDoc.GetElementsByTagName("XPAth"); 
     //Actual Namespace in XML, which should be used in Proxy Class 
     string namespaceURIForObjectInXML = v1.NamespaceURI; 
    } 

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
    { 

    } 



} 
0

Verificare che la definizione/specifica corrisponda all'uscita. Confronta il WSDL (nel browser) e la risposta (in SOAP-UI, Fiddler), ad es.

  • WSDL utilizza caso di cammello (lastName) e la risposta
  • utilizza trattini (cognome).
Problemi correlati