为啥从 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 服务返回数据集或数据表不是一个好习惯?啥是替代品?的主要内容,如果未能解决你的问题,请参考以下文章