WCF. Servizio metodi generici

Come posso utilizzare metodi generici nel servizio wcf?

Ho scritto questo codice:

[OperationContract] void AddItem(T item); 

Ma ricevo il seguente errore:

Il tipo “T” non può essere esportato come tipo di schema perché è un tipo generico aperto. È ansible esportare un tipo generico solo se tutti i tipi di parametri generici sono di tipo effettivo.

Semplicemente non puoi. Non è ansible farlo, come il soap non supporta questo. Vedi questo articolo , che menziona come aggirare i generici, creando un object locale intermedio che viene chiamato e lancia l’object prima di chiamare l’operazione WCF.

Non dovresti provare a farlo. In un servizio Web abilitato a SOAP tutti i tipi devono essere noti quando il WSDL viene pubblicato in modo che i client siano in grado di generare un proxy. Generics semplicemente non esistono nelle specifiche SOAP. SOAP è inteso per essere interoperabile e generici non esistono in tutte le lingue.

Come tutti gli altri hanno già menzionato, WCF e SOAP non supportano questo. Il problema è: qualsiasi cosa si passi avanti e indietro tra client e server deve essere espressa in un documento dello schema XML.

Lo schema XML supporta tutti i soliti tipi atomici, come string, int, datetime e supporta tipi complessi costituiti da questi tipi atomici e supporta l’ereditarietà.

Ma lo schema XML non ha supporto per i generici – e quindi, tutto ciò che si scambia tramite WCF e SOAP non può essere generico – è necessario utilizzare solo tipi concreti, non generici.

Neanch’io lo so. È un limite e devi conviverci per ora.

È ansible utilizzare tipi generici limitati nei contratti di dati, ma i parametri dei tipi specificati nel contratto di servizio e i parametri di tipo specificato con contratti di dati validi devono essere specificati

L’errore dice che i tipi aperti non sono consentiti. Ciò che probabilmente è permesso è qualcosa come:

 [OperationContract] void AddItem(T item) where T : MyBaseType; 

Ovviamente, tutti i tipi ereditati dovrebbero essere aggiunti con l’attributo KnownType.