请详细说明。我一直在告诉我的导师,我在WCF上研究的所有内容以及网络上的许多程序员都表示将DataSet传递给服务并不好,为什么会这样?我在服务中创建了一个BUNCH类,并且在应用程序中做了很好的工作,但他说我只是浪费时间完成所有工作,他有更好的方法。
他一直告诉我要创建一个单一的OperationContract。服务中将有许多函数,但OperationContract将获取函数的字符串名称和提供该函数详细信息的数据集。
他的做法不好吗?不安全?我只是想了解为什么许多人说不使用数据集。
答案 0 :(得分:2)
第一个原因是互操作性。如果您希望服务的使用者能够使用除.NET以外的任何其他技术来实现,那么在DataSet中提取或生成数据可能会遇到很多麻烦,因为他们的数据结构没有相同的数据结构。
性能也会受到相当大的影响。特别是,非类型化数据集的序列化格式可能很大,因为它不仅包含数据,还包含数据集的XSD架构,这可能非常大,具体取决于DataSet的复杂性。这可能会使您的邮件变得更大,这会占用更多的网络带宽,需要更长的时间来传输(特别是在高延迟链接上),并且会在端点上花费更多资源来解析。
答案 1 :(得分:0)
所以你所拥有的网络服务做了一些具体的事情让我们说它发送了一堆电子邮件。让我们说这个服务有一种发送电子邮件的方法。该方法应接受并通过电子邮件发送地址,主题和正文。
现在,如果我们发送一个包含所需信息的数据集,服务必须知道数据的形状并解析它。
或者,如果Web服务接受了具有电子邮件地址,主题和正文属性的对象。它可以在多个地方使用,并且不太容易对错误的数据集进行错误的处理。
答案 2 :(得分:0)
还有一件事:您可以使用DataSet获取不正确的数据。
例如,在序列化之前,DataSet中的值可能如下所示:
<date_time>12:19:38</date_time>
在客户端中,它会带有指定的偏移量:
<date_time>12:19:38.0000000-04:00</date_time>
客户端代码会将其调整为当地时间(与您安排与不同时区的某人约会时的Outlook非常相似)。
可以找到更多详细信息here。
答案 3 :(得分:0)
使用WCF不仅仅是一个实现决策 - 它是一种设计选择。当您选择使用WCF时,您必须放弃许多您珍惜的OO原则,并采用与服务导向相关的一组新模式和主体。
一个这样的原则是明确的合同:服务应该有明确定义的公共合同(参见this Wikipedia article)。这对于互操作性至关重要,但也很重要,因此客户可以准确了解您的服务提供的功能。
DataSet基本上只是一大堆“东西” - 它可能包含的内容没有限制 - 或任何明确定义的合同,它解释了我如何获取数据。通过使用DataSet,您可以引入客户端和服务器之间的固有耦合 - 客户端必须具有关于如何创建DataSet以获取数据的“内部信息”。通过在客户端和服务之间引入这种级别的耦合,您刚刚否定了使用WCF的主要动机之一(正是将两个功能区域分离以允许独立部署和/或开发生命周期)。