2009-09-25 2 views
1

я подозреваю, я был очень глупо здесь, но у меня есть следующие настройкиВозвращение унаследованный класс как тип базового класса с веб-службами

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 

Я тогда есть веб-сервис, который имеет метод

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

End function 

Запуск это приводит к следующей ошибке

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." 

Так что мой вопрос, есть ли способ «Расширение» унаследованного класса базовому классу, чтобы это работало?

EDIT: RE: предложение относительно XmlInclude (typeof inheritedClass), в настоящее время этот метод потенциально может возвращать несколько типов наследуемого класса (то есть myInheritedClassA и myInheritedClassB) - это случай просто добавить каждый из унаследованных типов в этом тег?

Я внес изменения в пример, чтобы сделать вещи более четкие

ответ

1

Вы пробовали следующее, то есть добавление класса атрибута SoapInclude для любой отличается наследуется класс GetSomeClass() может возвращать? (См this MSDN reference)

EDIT:SoapInclude, если вы используете кодировку SOAP, но использовать XmlInclude, с тем же синтаксисом, если ваш веб-сервис не SOAP-за-SE (который это, вероятно, лучше для ;-))

<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

Вы должны использовать XmlIncludeAttribute указать фактические типы вернуться.

согласно MSDN XmlIncludeAttribute

При применении XmlIncludeAttribute, указать тип производного класса. Когда XmlSerializer сериализует объекты, которые включают как базовый, так и производный класс, он может тогда распознавать оба типа объектов.

Вы можете использовать XmlIncludeAttribute для включают производные классы в сервис описания документов, которые написаны в Web Services Описание Language (WSDL). Например, если метод возвращает объект, примените метод XmlIncludeAttribute к методу и укажите фактические типы для возврата.

ниже образца, чтобы применить atttibute к веб-метода

<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 Синтаксис атрибут, используемый в том, что для C# (OP нуждается в VB.NET), но достаточно близко. Теперь, хороший улов, я предположил, что OP использует SOAP-кодирование, но в случае использования «простой» кодировки XmlInclude является билетом. Я исправлю свой ответ соответственно. – mjv

+0

@mjv вы правы !. C# просто пришел естественно, когда отвечал, так как его было несколько лет, я остановил vb ....обновит это сейчас ... – RameshVel