【问题标题】:Accessing data set over WCF without serializing the entire thing?通过 WCF 访问数据集而不序列化整个事物?
【发布时间】:2012-12-30 21:49:05
【问题描述】:

我是 WCF(和一般 .NET)的新手,所以如果这是常识,我深表歉意。

我正在设计一个 WCF 解决方案(目前使用实体框架来访问数据库)。我想从数据库中获取一组(可能非常大的)数据,并将其返回给客户端,但由于性能问题,我不想一次通过网络对整个数据集进行序列化。

我想操作以将某种对象返回给客户端,该对象代表结果数据,我想在客户端处理该数据,能够前后导航并检索实际根据需要通过网络传输数据。

我不想编写大量客户端代码来单独找出符合我的搜索条件的行,然后在我可以提供帮助的情况下单独调用以获取每条记录。我试图让客户端尽可能简单。

理想情况下,我想编写类似于以下伪代码的客户端代码:

Reference1.Service1Client MyService = new Reference1.Service1Client("Service1");

DelayedDataSet<MyRecordType> MyResultSet = MyService.GetAllCustomers();

MyResultSet.First();

while (!MyResultSet.Eof)
{
    Console.Writeline(MyResultSet.CurrentRecord().CUSTFNAME + " " + MyResultSet.CurrentRecord().CUSTLNAME);
    Console.Writeline("Press Enter to see the next customer");
    Console.Readline();
    MyResultSet.Next();
}

当然,DelayedDataSet 是我刚刚编造的,我希望 .NET 中也存在类似的东西。

对 MyService.GetAllCustomers() 的调用将返回此 DelayedDataSet 对象,实际上并不包含实际记录。在调用 CurrentRecord() 之前,实际数据不会通过网络传输。 Next() 和 Previous() 将简单地更新服务器端的游标以指向适当的记录。我不希望客户端对数据库或实体框架有任何直接可见性。

我猜测我编写代码的方式可能不适用于 WCF,并且 CurrentRecord()、Next()、First() 等函数必须是单独的服务合同操作。我想我只是在寻找一种方法来做到这一点,而不必编写我自己的所有代码来缓存服务器上的结果,以某种方式持久化服务器端的数据集,在我的服务库中编写所有检索和导航代码等. 我希望大部分内容已经为我完成了。

这似乎是一个非常普遍需要的功能。那么,这样的事情存在吗?

-乔

【问题讨论】:

    标签: asp.net wcf entity-framework


    【解决方案1】:

    不,这不是 WCF 的设计初衷。

    在 WCF 中,非常基本的核心体系结构是您有一个客户端和一个服务器,只有 (XML-) 序列化数据在两者之间通过网络传输。

    WCF 不是 远程过程调用 方法,或者某种远程对象 机制 - 没有 客户端和服务器之间的连接,除了符合两者之间定义的服务(和数据)合同的序列化消息。

    WCF不是设计用于处理大量数据 - 它设计用于处理单个消息(GetCustomerByID(42) 等)。由于 WCF 从一开始就被设计为可与其他平台(非 .NET,也如 Java、Ruby 等)互操作,因此您绝对应该使用繁重的- 加权 .NET 特定类型,例如 DataSet 无论如何 - 使用适当的对象。

    此外,由于 WCF 最终将所有内容序列化为 XML 并通过线路发送,因此传递的所有数据都必须在 XML 模式中表示 - 不包括接口和/或泛型。

    从我在您的帖子中看到的内容来看,您正在寻找更多的是“进程内”数据访问层,而不是服务级别。因此,如果您想继续走这条路,您应该结合实体框架研究存储库和工作单元模式。

    更多信息:

    【讨论】:

    • 是的,我开始明白 WCF 一次只能处理少量数据。不过,随着 .NET/WCF 的更新版本的出现,它们似乎确实能够序列化越来越复杂的数据类型,这就是给我这个想法的原因。我仍然认为 WCF 是正确的解决方案,因为它对于将数据库从客户端抽象出来很有用。问题是根据需要获取较小的数据块。在我看来,除了手写所有代码之外,可能/应该有一种更简单的方法来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2010-12-28
    • 2020-07-11
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多