我对 WCF(以及一般的 .NET)还很陌生,所以如果这是常识,我深表歉意。
我正在设计一个WCF解决方案(当前使用 Entity Framework 来访问数据库)。我想从数据库中获取一组(可能非常大)数据,并将其返回给客户端,但出于性能方面的考虑,我不想通过网络一次性序列化整个数据集。
我希望进行操作以将某种对象返回给客户端,该对象表示结果数据,并且我希望在客户端上处理该数据,能够前后导航并检索实际的数据根据需要通过网络传输数据。
我不想编写大量客户端代码来单独找出哪些行满足我的搜索条件,然后进行单独的调用以获取每条记录(如果可以的话)。我试图让客户端尽可能简单。
理想情况下,我想编写类似于以下伪代码的客户端代码:
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() 只会更新服务器端的游标以指向适当的记录。我不希望客户端对数据库或 Entity Framework 有任何直接可见性。
我猜测我编写代码的方式可能无法在 WCF 上工作,并且 CurrentRecord()、Next()、First() 等函数必须是单独的服务契约操作。我想我只是在寻找一种方法来做到这一点,而不必编写自己的所有代码来缓存服务器上的结果,以某种方式保留数据集服务器端,在我的服务库中编写所有检索和导航代码等.我希望大部分工作已经为我完成。
这似乎是一个非常常用的功能。那么,这样的事情存在吗?
-乔
最佳答案
不,这不是 WCF 的设计目的。
在 WCF 中,非常基本的核心架构是有一个客户端和一个服务器,除了通过网络在两者之间传输的(XML-)序列化数据之外什么都没有。
WCF不是远程过程调用方法,或某种远程对象机制 - 没有客户端和服务器之间的连接,除了符合两者之间定义的服务(和数据)契约的序列化消息。
WCF 不是旨在处理大量数据 - 它旨在处理单个消息(GetCustomerByID(42)
等)。由于 WCF 从一开始就被设计为与其他平台(非 .NET,也如 Java、Ruby 等)可互操作,因此您绝对不应该不使用繁重的-无论如何,权重 .NET 特定类型,例如 DataSet
- 使用正确的对象。
此外,由于 WCF 最终将所有内容序列化为 XML 并通过线路发送,因此传递的所有数据都必须可以用 XML 模式表示 - 其中不包括接口(interface)和/或泛型。
从我在您的文章中读到的内容来看,您正在寻找更多的是“进程内”数据访问层 - 而不是服务级别。因此,如果您想继续沿着这条路走下去,您应该结合 Entity Framework 研究存储库和工作单元模式。
更多信息:
- MSDN: What is Windows Communication Foundation?
- WCF Essentials—A Developer's Primer
- Picture of the very basic WCF architecture从那本入门书来看——只有一 strip 有序列化消息的电线连接客户端和服务器——仅此而已;但序列化总是会发生
关于asp.net - 通过 WCF 访问数据集而不序列化整个数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14095014/