简体   繁体   English

从 WCF VB.NET 返回 Object()

[英]Return Object() from WCF VB.NET

I have a WCF service which has this function:我有一个 WCF 服务,它有这个 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).该过程在服务中运行良好,但在其他应用程序中没有收到 object 并且我有一个例外,表明 http 不支持此功能(发送 object 数组)。

WCF only serializes (and deserializes) object types it "knows" about. WCF 仅序列化(和反序列化)它“知道”的 object 类型。 If your operation returns Object() , WCF at that point only knows about Object() itself and Object .如果您的操作返回Object() ,则 WCF 那时只知道Object()本身和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.您需要使用ServiceKnownType属性向 WCF 指示可以序列化(和反序列化)哪些实际对象,如下例所示。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM