2009-09-25 9 views
1

Je pense que je suis être très stupide ici, mais je la configurationDe retour d'une classe héritée en tant que type de classe de base avec les services Web

Class MustInherit myBaseClass 
'some stuff 

End Class 

Class myInheritedClassA 
     inherits myBaseClass 

'some more stuff 
End Class 


Class myInheritedClassB 
     inherits myBaseClass 

'some more stuff 
End Class 

suivant, je alors un service Web qui a une méthode

Function getSomeClass(id) as myBaseClass 
'a factory here dependent on the id will generate a myInherited Class 
return CType(aInstanceOfInheritedClass, mybaseClass) 

End function 

l'exécution de ce résultats dans l'erreur suivante

Unhandled Exception: System.InvalidOperationException: 
    There was an error generating the XML document. ---> 
    System.InvalidOperationException: 
    The type <type> was not expected. 
    Use the XmlInclude or SoapInclude attribute to specify types 
    that are not known statically." 

ma question est, est-il possible de 'Élargir' la classe héritée à la classe de base pour que cela fonctionne?

EDIT: RE: la suggestion concernant XmlInclude (typeof inheritedClass), actuellement cette méthode pourrait renvoyer un certain nombre de types de classe héritée (c.-à-myInheritedClassA et myInheritedClassB) est-il cas de simplement avoir à ajouter chacun des inheritedTypes dans ce marque?

J'ai modifié l'exemple dans l'espoir que les choses plus claires

Répondre

1

Avez-vous essayé ce qui suit, à savoir l'ajout de la classe d'attributs SoapInclude pour quelque autre classe héritée GetSomeClass() peut retourner? (Voir this MSDN reference)

EDIT:SoapInclude est si vous utilisez l'encodage SOAP, mais utilisez XmlInclude, avec la même syntaxe si votre service Web n'est pas SOAP par-soi (qui il est probablement mieux pour ;-))

<WebMethod(), SoapRpcMethod, SoapInclude(GetType(myInheritedClass)), _ 
    SoapInclude(GetType(MustInherit))> 

Function getSomeClass(id) as myBaseClass 
'a factory here dependent on the id will generate a myInherited Class 
return CType(aInstanceOfInheritedClass, mybaseClass) 

End function 
3

Vous devez utiliser XmlIncludeAttribute pour spécifier les types réels pour revenir.

selon msdn XmlIncludeAttribute

Lors de l'application du XmlIncludeAttribute, préciser le type de la classe dérivée. Lorsque XmlSerializer sérialise objets qui incluent à la fois la base et la classe dérivée, il peut alors reconnaître les deux types d'objet.

Vous pouvez utiliser le XmlIncludeAttribute à comprennent les classes dérivées dans les documents de description de service qui sont écrits dans le Web Services Description Language (WSDL). Par exemple, si une méthode renvoie un objet, appliquez le code XmlIncludeAttribute à la méthode et spécifiez les types réels à renvoyer.

dessous de l'échantillon pour appliquer le atttibute à la méthode web

<WebMethod(), XmlInclude(GetType(myInheritedClass))> 
Function getSomeClass(id) as myBaseClass 
    'a factory here dependent on the id will generate a myInherited Class 
     return CType(aInstanceOfInheritedClass, mybaseClass) 
End function 
+0

@Ramesh La syntaxe d'attribut utilisé est celui pour C# (OP a besoin VB.NET), mais assez proche. Maintenant, bonne prise, j'ai supposé que l'OP utilisait l'encodage SOAP, mais dans le cas où l'on utilise un encodage "plain", XmlInclude est le ticket. Je vais corriger ma réponse en conséquence. – mjv

+0

@mjv vous avez raison !. C# est venu tout naturellement en répondant, depuis ses quelques années j'ai arrêté vb ....sera mis à jour maintenant ... – RameshVel

Questions connexes