【问题标题】:Return Object() from WCF VB.NET从 WCF VB.NET 返回 Object()
【发布时间】:2011-08-17 20:00:45
【问题描述】:

我有一个具有此功能的 WCF 服务:

 Public Function ObtenerGruposYAnalisisYConclusionesPredefinidas() As Object() Implements ISrvConclusionesNotas.ObtenerGruposYAnalisisYConclusionesPredefinidas
    Dim conclus As New ConclusionesNotasDL
    Return conclus.ObtenerGruposYAnalisisYConclusionesPredefinidas()
End Function

返回此处指定的值:

Public Function ObtenerGruposYAnalisisYConclusionesPredefinidas() As Object()
    Dim objeto(2) As Object
    objeto(0) = ObtenerGruposAnalisis()
    objeto(1) = ObtenerAnalisis()
    objeto(2) = ObtenerConclusionesPredefinidas()
    Return objeto
End Function

每个函数都返回一个实体列表。
如果我单独调用这个函数,它们会返回它们的值。但我想要的是只调用一次服务而不是多次!
我希望能够像这样在另一个应用程序中接收它:

Dim concluNotas As SrvConclusionesYNotas.SrvConclusionesNotasClient = New SrvConclusionesYNotas.SrvConclusionesNotasClient
    Dim objeto() As Object = concluNotas.ObtenerGruposYAnalisisYConclusionesPredefinidas()

我该怎么办?

我必须以某种方式对其进行序列化吗?该过程在服务中运行良好,但在其他应用程序中没有接收到对象,我有一个异常,表明 http 不支持(发送对象数组)。

【问题讨论】:

    标签: .net vb.net wcf


    【解决方案1】:

    WCF 只序列化(和反序列化)它“知道”的对象类型。如果您的操作返回Object(),那么此时WCF 只知道Object() 本身和Object。您需要使用 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
    

    【讨论】:

    • 我正在使用 linq to sql,我添加了三个 但仍然无法正常工作
    • 您的服务返回的确切类型是什么?另外,您可以在服务器上启用跟踪吗?跟踪将准确告诉您是什么类型导致了问题。
    • 是的,我可以启用跟踪,老实说,我以前从未这样做过,我会调查它,当我这样做时,我会再写一次。谢谢
    • 您可以在msdn.microsoft.com/en-us/library/ms733025.aspx找到有关启用跟踪的信息
    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2018-02-07
    • 2013-09-13
    • 2015-01-24
    相关资源
    最近更新 更多