Annotazioni dei dati sui contratti di servizio WCF
-
03-07-2019 - |
Domanda
Ho un servizio WCF che contiene una classe [DataContract]. Ciascuna delle proprietà ha l'attributo [DataMember] e ho aggiunto un paio di attributi di annotazione dei dati [Obbligatorio] e [StringLength] a un paio di proprietà.
Consumo quindi questo servizio in un'applicazione asp.net MVC come riferimento di servizio. Quando ottengo un elenco di tutti gli attributi usando
var attr= from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>()
from attribute in prop.Attributes.OfType<ValidationAttribute>()
select attribute;
Vedo che nessuna delle annotazioni dei dati è arrivata. È una limitazione di WCF o sto facendo qualcosa di fondamentalmente sbagliato qui?
Soluzione
Gli attributi non verranno serializzati quando il tuo contratto dati viene inviato via cavo. Il nuovo attributo creato nei metadati essenziali associati alla proprietà e quindi al Tipo a cui appartiene la proprietà. Questi non sono dati e non saranno disponibili.
Suppongo che tu abbia aggiunto un riferimento al servizio nella tua applicazione asp.net mvc, questo, se non specificato, creerà nuove classi proxy che rappresentano il tuo contratto di dati.
Quando aggiungi il riferimento al servizio, se fai clic sul pulsante avanzato assicurati che l'opzione "Usa tipi esistenti" sia selezionata. Questo garantisce che il tuo servizio utilizzerà il tuo contratto esistente.
Questa potrebbe non essere la migliore pratica perché l'applicazione client dovrà essere a conoscenza del Tipo che stai restituendo dal servizio. Questo può andare bene se il tuo servizio viene utilizzato solo da te, nel qual caso dovrai aggiungere un riferimento al tuo contratto nella tua applicazione asp.net mvc.
Altri suggerimenti
Il team di OData sta lavorando a una soluzione per esporre i metadati di convalida come "vocabolari".
Ulteriori informazioni: http://www.odata.org/blog/vocabularies