euther
euther

Reputation: 2686

Return Object() from WCF VB.NET

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

Answers (1)

carlosfigueira
carlosfigueira

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

Related Questions