Reputation: 2686
I have a WCF service which has this function:
Public Function ObtenerGruposYAnalisisYConclusionesPredefinidas() As Object() Implements ISrvConclusionesNotas.ObtenerGruposYAnalisisYConclusionesPredefinidas
Dim conclus As New ConclusionesNotasDL
Return conclus.ObtenerGruposYAnalisisYConclusionesPredefinidas()
End Function
which returns the values specified here:
Public Function ObtenerGruposYAnalisisYConclusionesPredefinidas() As Object()
Dim objeto(2) As Object
objeto(0) = ObtenerGruposAnalisis()
objeto(1) = ObtenerAnalisis()
objeto(2) = ObtenerConclusionesPredefinidas()
Return objeto
End Function
Each one of this functions returns a List of entities.
If I call this functions individually they return their values ok. But what I want is to make only one call to the service and no several!
I want to be able to receive it in another application like this:
Dim concluNotas As SrvConclusionesYNotas.SrvConclusionesNotasClient = New SrvConclusionesYNotas.SrvConclusionesNotasClient
Dim objeto() As Object = concluNotas.ObtenerGruposYAnalisisYConclusionesPredefinidas()
What should I do?
Do I have to serialize it some way? The process is working great in the service, but in the other app is not receiving the object and I have an exception which suggests this is not supported by http (sending a object array).
Upvotes: 0
Views: 1600
Reputation: 87293
WCF only serializes (and deserializes) object types it "knows" about. If your operation returns Object()
, WCF at that point only knows about Object()
itself and Object
. You'll need to indicate to WCF which actual objects can be serialized (and deserialized), by using the ServiceKnownType
attribute, like in the example below.
Public Class StackOverflow_7098691
Public Class GruposAnalisis
Public Text As String
End Class
Public Class Analisis
Public Text As String
End Class
Public Class ConclusionesPredefinidas
Public Text As String
End Class
<ServiceContract()>
Public Interface ITest
<OperationContract()>
<ServiceKnownType(GetType(GruposAnalisis))>
<ServiceKnownType(GetType(Analisis))>
<ServiceKnownType(GetType(ConclusionesPredefinidas))>
Function ObtenerGruposYAnalisisYConclusionesPredefinidas() As Object()
End Interface
Public Class Service
Implements ITest
Public Function ObtenerGruposYAnalisisYConclusionesPredefinidas() As Object() Implements ITest.ObtenerGruposYAnalisisYConclusionesPredefinidas
Dim objeto(2) As Object
objeto(0) = ObtenerGruposAnalisis()
objeto(1) = ObtenerAnalisis()
objeto(2) = ObtenerConclusionesPredefinidas()
Return objeto
End Function
Function ObtenerGruposAnalisis() As GruposAnalisis
Dim result As GruposAnalisis = New GruposAnalisis()
result.Text = "GruposAnalisis"
Return result
End Function
Function ObtenerAnalisis() As Analisis
Dim result As Analisis = New Analisis()
result.Text = "Analisis"
Return result
End Function
Function ObtenerConclusionesPredefinidas() As ConclusionesPredefinidas
Dim result As ConclusionesPredefinidas = New ConclusionesPredefinidas()
result.Text = "ConclusionesPredefinidas"
Return result
End Function
End Class
Public Shared Sub Test()
Dim baseAddress As String = "http://" + Environment.MachineName + ":8000/Service"
Dim host As ServiceHost = New ServiceHost(GetType(Service), New Uri(baseAddress))
host.AddServiceEndpoint(GetType(ITest), New BasicHttpBinding(), "")
host.Open()
Console.WriteLine("Host opened")
Dim factory As ChannelFactory(Of ITest) = New ChannelFactory(Of ITest)(New BasicHttpBinding(), New EndpointAddress(baseAddress))
Dim proxy As ITest = factory.CreateChannel()
Dim result = proxy.ObtenerGruposYAnalisisYConclusionesPredefinidas()
For Each grupo In result
Console.WriteLine(grupo)
Next
End Sub
End Class
Upvotes: 2