为什么将数据集传递给 Web 服务方法不好?

Why is passing a dataset to a web service method not good?

请详细说明。我一直在告诉我的导师,我在 WCF 上研究过的所有内容以及网络上的许多程序员都说将数据集传递给服务是不好的,这是为什么呢?我在服务中创建了一个 类 的 BUNCH,并且与应用程序配合得很好,但他说我只是在浪费时间做所有这些工作,他有更好的方法。

他一直告诉我创建一个 SINGLE OperationContract。服务中会有很多函数,但 OperationContract 将采用函数的字符串名称和提供该函数详细信息的数据集。

他的做法不好吗?不安全?我只是想了解为什么很多人说不要使用数据集。

第一个原因是互操作性。如果您希望您的服务的使用者使用 .NET 以外的任何其他技术来实现,他们可能会在 DataSet 中提取或生成数据时遇到很多麻烦,因为他们最终没有等效的数据结构。

性能也会受到很大影响。特别是,无类型数据集的序列化格式可能非常庞大,因为它不仅包含数据,还包含数据集的 XSD 模式,根据数据集的复杂性,它可能非常大。这会使您的消息变得更大,这将使用更多的网络带宽,传输时间更长(特别是通过高延迟链接),并将在端点占用更多资源来解析。

所以你的网络服务做了一些特定的事情,假设它发送了一堆电子邮件。假设此服务有一种发送电子邮件的方法。该方法应接受电子邮件地址、主题和正文。

现在,如果我们发送包含所需信息的数据集,则服务必须知道数据的形状并对其进行解析。

或者,如果 Web 服务接受具有电子邮件地址、主题和正文属性的对象。它可以在多个地方使用,并且不太容易因数据集格式错误而出错。

还有一件事:您可以使用 DataSet 获取不正确的数据。

For example a value in the DataSet might look like the following before serialization:

<date_time>12:19:38</date_time>

In the client it would come with a offset specified:

<date_time>12:19:38.0000000-04:00</date_time>

The client code would adjust this to its local time (much like Outlook when you schedule an appointment with someone in a different timezone).

可以找到更多详细信息 here

使用 WCF 不仅仅是一个实现决策 - 它是一个设计选择。当您选择使用 WCF 时,您必须放弃许多宝贵的 OO 原则,并接受一组与面向服务相关的新模式和原则。

其中一个原则是显式契约:服务应具有明确定义 public 契约(参见this Wikipedia article)。这对于互操作性至关重要,但也很重要,这样客户才能准确了解您的服务提供的功能。

DataSet 基本上只是 "stuff" 的一大袋 - 它可以包含的内容没有限制 - 或解释我如何获取数据的任何定义明确的合同。通过使用 DataSet,您在客户端和服务器之间引入了内在耦合 - 客户端必须 "inside information" 关于如何创建 DataSet 才能获取数据。通过在客户端和服务之间引入这种级别的耦合,您刚刚否定了使用 WCF 的主要动机之一(准确地说是解耦两个功能区域以允许独立部署 and/or 开发生命周期)。