【发布时间】:2014-06-16 15:57:07
【问题描述】:
我正在寻找有关 WCF Web 服务中 DataTables 和 DataSets 行为的说明。
对于 ASMX Web 服务,DataTable 对象不可序列化,因此不可在 Web 方法中返回。我总是用 ASMX 返回数据集。
我正在转向 WCF 服务,我想确认返回 DataTables 和 DataSets 的这种行为与这项技术相同。我的测试表明是这样,但我想确认这实际上是行为,或者是否有一些我没有做的事情才能成功返回 DataTable。
此外,在返回用户定义类型的对象时,我无法成功地将 DataTable 或 DataSet 作为用户定义类的公共属性返回。
例如,对于下面的测试类,从 WCF 服务返回 CTestClass 类型的对象会返回属性 DOB、Name 和 YearsOfAge,但无法返回 MyDataSet。 DataSet 在构造函数中创建。当我将 GetDataSet 函数作为公共函数调用时,我的 WCF Web 服务成功地将 DataSet 返回给客户端应用程序。
Public Class CTestClass
Public Sub New()
m_myDataSet = Me.GetDataSet
End Sub
Private m_DOB As Date
Public Property DOB() As Date
Get
Return m_DOB
End Get
Set(ByVal value As Date)
m_DOB = value
End Set
End Property
Private m_sName As String
Public Property Name() As String
Get
Return m_sName
End Get
Set(ByVal value As String)
m_sName = value
End Set
End Property
Private m_iYearsOfAge As Integer
Public Property YearsOfAge() As Integer
Get
Return m_iYearsOfAge
End Get
Set(ByVal value As Integer)
m_iYearsOfAge= value
End Set
End Property
Private m_myDataSet As DataSet
Public ReadOnly Property MyDataSet() As DataSet
Get
Return m_myDataSet
End Get
End Property
Private Function GetDataSet() As DataSet
Dim ds As New DataSet
Dim dt As New DataTable
' Create new DataTable instance.
Dim table As New DataTable
' Create four typed columns in the DataTable.
table.Columns.Add("Dosage", GetType(Integer))
table.Columns.Add("Drug", GetType(String))
table.Columns.Add("Patient", GetType(String))
table.Columns.Add("Date", GetType(DateTime))
' Add five rows with those columns filled in the DataTable.
table.Rows.Add(25, "Indocin", "David", DateTime.Now)
table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now)
table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now)
table.Rows.Add(21, "Combivent", "Janet", DateTime.Now)
table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now)
table.Rows.Add(500, "Paracetamol", "Simone", DateTime.Now)
ds.Tables.Add(dt)
Return ds
End Function
End Class
【问题讨论】:
-
您需要为序列化程序提供一个设置器才能工作。 stackoverflow.com/questions/1702802/…
-
所以我的测试类没有返回 DataSet 的问题与属性是只读的有关吗?
-
有什么方法可以让我的服务从公共函数返回 DataTable?
-
是的,只读是行不通的,如果你用谷歌搜索“wcf serialize datatable”,你会发现它很重要,为什么不返回数据集或者更好的 DTO。
标签: vb.net web-services wcf datatable dataset