Asp.net 通过WCF访问数据集而不序列化整个内容?

Asp.net 通过WCF访问数据集而不序列化整个内容?,asp.net,wcf,entity-framework,Asp.net,Wcf,Entity Framework,我对WCF(和.NET)非常陌生,所以如果这是常识,我很抱歉 我正在设计一个WCF解决方案(目前使用实体框架访问数据库)。我想从数据库中获取一组(可能非常大)数据,并将其返回给客户机,但出于性能考虑,我不想通过网络一次性序列化整个数据集 我希望操作能够向客户端返回某种表示结果数据的对象,并且我希望在客户端上处理这些数据,能够在其中来回导航,并根据需要通过网络检索实际数据 我不想编写大量的客户机代码来单独找出哪些行符合我的搜索条件,然后单独调用以获取每个记录(如果我能提供帮助的话)。我正试图让客户

我对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();
}
Reference1.Service1Client MyService=新的Reference1.Service1Client(“Service1”);
DelayedDataSet MyResultSet=MyService.GetAllCustomers();
MyResultSet.First();
而(!MyResultSet.Eof)
{
Console.Writeline(MyResultSet.CurrentRecord().CUSTFNAME+“”+MyResultSet.CurrentRecord().CUSTLNAME);
Console.Writeline(“按Enter键查看下一个客户”);
Console.Readline();
MyResultSet.Next();
}
当然,DelayedDataSet是我刚刚编造的,我希望.NET中也存在类似的东西

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

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

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


-乔:不,这不是WCF设计的目的

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

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

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

此外,由于WCF最终将所有内容序列化为XML并通过网络发送,因此传递的所有数据都必须能够在XML模式中表达,这就排除了接口和/或泛型

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

更多信息:

  • 从那本入门书中——只有一条连接客户机和服务器的串行消息连接线——仅此而已;但是序列化总是会发生

  • 不,这不是WCF设计的目的

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

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

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

    此外,由于WCF最终将所有内容序列化为XML并通过网络发送,因此传递的所有数据都必须能够在XML模式中表达,这就排除了接口和/或泛型

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

    更多信息:

    • 从那本入门书中——只有一条连接客户机和服务器的串行消息连接线——仅此而已;但是序列化总是会发生

    是的,我开始理解WCF是指一次处理一小块数据。尽管如此,它似乎并没有