为啥从 WCF 服务返回数据集或数据表不是一个好习惯?啥是替代品?

Posted

技术标签:

【中文标题】为啥从 WCF 服务返回数据集或数据表不是一个好习惯?啥是替代品?【英文标题】:Why returning dataset or data table from WCF service is not a good practice? What are the Alternatives?为什么从 WCF 服务返回数据集或数据表不是一个好习惯?什么是替代品? 【发布时间】:2014-11-10 12:35:50 【问题描述】:

我正在开发大学管理系统,我在该系统上使用 WCF 服务,并且在该服务中我使用 DataTables 和 DataSets 从数据库中获取数据,而数据库是 sql server。

我的问题是

使用数据表和数据集是“好做法”还是“坏做法”? 如果不好,DataTable/DataSet的替代品是什么? 如果不好,主要原因是什么?

【问题讨论】:

Returning DataSets from WebServices is the Spawn of Satan and Represents All That Is Truly Evil in the World 斯科特·汉塞尔曼 您是在服务中使用它们还是在之外使用它们,例如返回它们? 您正在构建的服务的责任是什么,您知道(并且可以控制)客户吗? @nvoigt:我在内部和外部都使用 DataTables/DataSets @Jocke :是的,我可以控制客户 【参考方案1】:

从 Web 服务返回数据集通常不被视为“良好做法”。这些问题已在以下链接中详细记录:

http://msdn.microsoft.com/en-us/magazine/cc163751.aspxhttp://www.4guysfromrolla.com/articles/051805-1.aspxhttp://msdn.microsoft.com/en-us/magazine/cc188755.aspx

总之,从 Web 服务返回 DataSet 对象的最大问题似乎涉及序列化性能、非 .net 互操作性。此外,DataSet 的通用、多态性质通常在运行时之前的数据结构较高,因此,WSDL 定义没有提供方法签名的完整描述。但是,与任何设计决策一样,您需要权衡成本与收益,并根据您的特定目标和限制确定最合适的方案。

就替代方案而言,您可以考虑使用通用集合(例如List<yourClassHere>),或者甚至考虑进行一些架构修订以允许使用 ODATA。

以下链接为通过 Web 服务返回实体提供了一些很好的背景参考。 http://msdn.microsoft.com/en-us/library/orm-9780596520281-01-14.aspx http://www.codeproject.com/Articles/127395/Implementing-a-WCF-Service-with-Entity-Framework http://msdn.microsoft.com/en-us/data/hh237663.aspx

【讨论】:

+1 但请简要概述这些链接中的内容。 你能给我提供一些关于收藏或任何链接的例子吗?? @Seymour : 使用 DataSet/DataTable 与 .Net 平台以外的 WCF 服务的互操作性是否会保留? 一般来说,我认为返回 DataSet 的 WCF 服务会为其他平台带来互操作性问题/挑战。 ***.com/questions/1752072/wcf-and-java-interop【参考方案2】:

在 WCF 服务中返回类型为 datatable 失败的原因有 3 个

您必须指定数据表名称,例如:

MyTable=new DataTable("tableName");

当您在 WCF 服务的客户端添加引用时,请选择可重用 dll system.data

datatable成员变量上指定属性

[DataMember]
public DataTable MyTable get; set; 

【讨论】:

【参考方案3】:

我在我的 WCF 应用程序中使用 DataTable,但出现错误。这就是我修复错误的方法。

当从 WCF 中的 Web 服务返回 DataTable 到 Windows 窗体应用程序时。我遇到了这个异常。

System.ServiceModel.CommunicationException: '接收到http://localhost:52968/MunerahService1.svc 的 HTTP 响应时出错。这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。'

每当我尝试检索DataTable时都会发生这种情况

要修复异常,我需要为 DataTable 命名。

有错误的代码

 tab = new DataTable(); 

修复了删除异常的代码

 tab = new DataTable("Doctor_info");

【讨论】:

这并没有真正回答原来的问题,还是这样?

以上是关于为啥从 WCF 服务返回数据集或数据表不是一个好习惯?啥是替代品?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WCF 会返回 myObject[] 而不是 List<T> 像我期望的那样?

为啥我必须使用 WCF 而不是 Web 服务? [复制]

wcf 数据服务是不是可以返回 json 格式的元数据?

POX 从 WCF 数据服务返回数据

从 WCF 服务返回的 JSON 数据包含转义字符

如何从 WCF 数据服务返回复杂类型?