type dérivé inconnu WSE 3.0 service Web
-
20-09-2019 - |
Question
J'ai un service Web basé WSE 3.0, et une application cliente WinForms qui utilise des types définis dans References.cs de ce service, mais les sous-classes pour fournir des fonctionnalités supplémentaires requises par le client.
Cependant, quand je passe une instance de la sous-classe de retour au service Web, même si je jetai explicitement revenir au type d'origine, je reçois le tant redouté:
Utilisez l'XmlInclude ou un attribut SoapInclude pour spécifier les types qui ne sont pas connus statiquement.
en référence à mon type dérivé.
Résumé de code:
public class DefinedInReferenceCs
{
// ...
}
public class ClientSubclass : DefinedInReferenceCs
{
// My extra stuff
}
public class MyClient
{
public CallTheWebService(ClientSubclass obj)
{
// obj is an instance of ClientSubclass, cast as DefinedInReferenceCs
svc.MyMethod((DefinedInReferenceCs)obj);
// Throws an exception complaining that ClientSubclass is not statically known
}
}
Je peux contourner ce problème en créant explicitement une instance DefinedInReferenceCs et en effectuant une copie en profondeur des domaines pertinents. Y at-il une meilleure façon?
La solution
Depuis le sérialiseur XML utilise la réflexion pour travailler avec des objets, il n'y a aucun moyen de l'empêcher de voir que vos références de référence de classe de base d'une instance de votre classe dérivée. Oui, vous devez utiliser XmlInclude
.
OTOH, avez-vous envisagé d'utiliser des classes partielles pour ajouter des fonctionnalités aux classes proxy d'origine? De cette façon, vous ne seriez pas besoin d'une classe dérivée du tout.