Cosa causerebbe la restituzione di un servizio WCF da restituire un oggetto di tipo & # 8220; oggetto & # 8221;

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

Domanda

Per il mio altro post su Valori di restituzione del servizio WCF , sto consumando un servizio Web di un'altra società e quando aggiungo il riferimento al servizio in Visual Studio, il valore di ritorno del metodo è un oggetto di tipo oggetto .

L'autore del servizio web mi ha mostrato il codice e in realtà restituisce un oggetto digitato.

Mi manca qualcosa o la classe proxy dovrebbe restituire un valore tipizzato?

Esiste un'impostazione per generare la classe proxy o il servizio effettivo?

UPDATE:

Ho esaminato le classi reali dietro il servizio WCF e ho capito che il valore di ritorno del metodo di servizio sta effettivamente restituendo una interfaccia , implementata dal tipo concreto. Il tipo concreto è contrassegnato con l'attributo [DataContract] (e gli attributi [DataMember] appropriati), ma l'interfaccia non ha tali attributi. Ciò potrebbe causare il servizio per impostare il tipo restituito come oggetto?

È stato utile?

Soluzione

Ipoteticamente, se tu fossi lo sviluppatore del servizio, potresti usare un KnownTypeAttribute :

[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}

[DataContract]
public class MyConcreteClass : IMyInterface {
}

Non l'ho provato personalmente con un'interfaccia, ma l'ho provato con una classe base astratta e funziona benissimo. Quando il client riceve il valore restituito, può eseguire correttamente il downcast alla classe derivata.

È possibile che il codice del servizio lo faccia effettivamente e il problema risiede nel svcutil.exe che non genera le classi proxy in modo sufficientemente accurato.

Anche se non controlli il codice del servizio, controlli il codice proxy del client. Potresti provare a modificare manualmente le classi proxy che svcutil.exe ti ha dato per aggiungere tu stesso il KnownTypeAttribute . In questo modo, stai assumendo il controllo del comportamento di DataContractSerializer alla tua fine e, fintanto che ti preoccupi di non modificare il formato dei fili per errore, tutto dovrebbe ancora funzionare.

Altri suggerimenti

La classe proxy è un file generato e come tale può contenere errori. Se disponi di una copia del contratto sui dati, sei libero di modificare la classe proxy per utilizzare il tipo corretto anziché System.Object e le cose dovrebbero funzionare correttamente.

Visual Studio " Aggiungi riferimento al servizio " tool e svcutil.exe sono molto bravi a generare classi proxy ma non sono perfetti. I file che generano sono tuoi da modificare e ti incoraggio a modificare semplicemente l'operazione per restituire il contratto di dati corretto.

Si è verificato un problema simile durante l'utilizzo di un servizio Web Java da WCF.

Nel nostro caso il tipo che diceva che stava tornando era una versione limitata di ciò che veniva effettivamente restituito.

Ciò che ha funzionato per noi è stato quello di lanciare l'oggetto nel tipo previsto. Successivamente i dati erano disponibili.

Pertanto, per risolvere il problema potresti provare a trasmettere l'oggetto al tipo previsto.

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