2010-07-21 14 views
2

Tenir compte un webmethod qui expose une classe abstraite:supplémentaires dans Expose les classes WebService ASP.NET 2.0

[WebMethod] 
public void Save(AbstractEntity obj) 
{ 
    // .. 
} 

Il existe plusieurs classes héritant de AbstractEntity comme

public class Patient : AbstractEntity 
{ 
    // ... 
} 

Maintenant, je veux permettre au webservice consommateur pour créer un nouvel objet patient et l'enregistrer:

service.Save(new Patient { Name = "Doe", Number = "1234567" }); 

B ecause "Enregistrer" prend une AbstractEntity, il n'y aura pas de proxy Patient côté client. Je pourrais bien sûr créer une méthode factice qui expose un Patient, mais j'espère qu'il y aura une meilleure façon.

Comment exposer la classe Patient et d'autres classes qui ne sont pas directement référencées dans l'interface webservice d'une manière agréable?

Répondre

5

Vous devez ajouter un attribut XmlInclude à votre méthode:

[WebMethod] 
[XmlInclude(typeof(Patient))] 
public void Save(AbstractEntity obj) 
{ 
    // .. 
} 

Comme écrit dans les commentaires, lorsque vous ajoutez l'attribut XmlInclude et mettre à jour la référence Web sur le côté client, les classes de proxy pour les AbstractEntity Patient (issu de AbstractEntity) sera généré. Une chose qui n'est pas très agréable, c'est que chaque fois que vous créez une nouvelle classe dérivée de AbstractEntity, vous devrez ajouter un autre attribut XmlInclude à toutes les méthodes web connexes.

+0

Dans le code client, la référence fournit-elle un proxy patient ou l'OP doit-il dériver du proxy AbstractEntity? –

+0

merci! ... (remplisseur) ... –

+0

Le proxy patient dérive du proxy Abstraitité, qui sont tous deux fournis. –