asp.net - 通过 WCF 访问数据集而不序列化整个数据?

标签 asp.net wcf entity-framework

我对 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 研究存储库和工作单元模式。

更多信息:

关于asp.net - 通过 WCF 访问数据集而不序列化整个数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14095014/

相关文章:

c# - Entity Framework 仅适用于Web应用程序吗?

asp.net - 在 ASP.NET 中缓存链接页面

javascript - 使用 Awesomium 在 ASP.NET Web 表单回发后自动下载

wcf - 是否可以在 IIS6 托管服务中托管 TCP 端点?

.net - WCF:不关闭 ChannelFactory 与不断重新创建 ChannelFactory 并关闭它之间的比较

entity-framework - 数据库中的 EF 6.1 Code First 不显示存储过程

.net - 在网络共享或 Intranet 项目上编译网站时,请求类型 'System.Web.AspNetHostingPermission' 的权限失败

asp.net - IIS7 间歇性地抛出 500 错误。谁能帮我诊断一下吗?

wcf - 如何删除 ServiceHost 持有的大对象堆上的 Byte[]

entity-framework - 将数据库优先迁移到代码优先 - 从发布切换到迁移