【问题标题】: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的替代品是什么?
  • 如果不好,主要原因是什么?

【问题讨论】:

标签: c# sql wcf datatable dataset


【解决方案1】:

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

http://msdn.microsoft.com/en-us/magazine/cc163751.aspx
http://www.4guysfromrolla.com/articles/051805-1.aspx
http://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 服务会为其他平台带来互操作性问题/挑战。 stackoverflow.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");
    

    【讨论】:

    • 这并没有真正回答原来的问题,还是这样?
    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 2020-01-03
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多