2012-11-20 164 views
1

或者 - 至少我认为正确的术语是有状态的。我得到了一个wcf服务,将大量数据列回给我。事实上,这么多的数据,我超过了maxrecievedmessagesize - 程序崩溃。WCF有状态服务

我已经认识到我需要将调用拆分到数据库。我不需要检索5000行,而需要获得第1 - 200行,记住行号200的编号,从行编号200的编号中获取下一行200行,依此类推。

有谁知道如何做到这一点?是有状态的(如在“无国界的对立面”)正确的路要走吗?我将如何继续......?有人能指点我一个例子吗?

+1

如果可能,服务应始终为**无状态**。基本上,你的**调用者**应该负责指定他想要的行 - 1-100,101-200等等。 - 服务本身不需要知道关于状态的任何信息。它只是返回客户端请求的那些行。 –

+1

@marc_s你是对的,服务应该最好是无状态的,另一方面,将显式行号传递给客户端会暴露服务和底层数据库的大部分内部状态...,这也应该避免...但是,如果整行(带ID)无论如何返回,那么你是完全正确的,所以投票支持你 – Daniel

+1

比方说,我得到1 - 100行,然后101 - 200,如果有人改变行58 ?我不会通过使用状态来防止这种情况吗? 而且 - 这是这种问题的最佳做法吗? (使呼叫者决定获得第1-100行,然后101-200) – myUser8519

回答

0

您的场景中不需要有状态的服务。有状态的服务最好避免,特别是当你想在那里保存5000行时。

客户端应该指定它需要多少数据。所以它可能是GetRows(index,amount)方法,其中索引是获取行的开始索引和从开始索引开始的行数。

客户端也应该询问服务的数据状态,服务只是发送数据状态。例如,当您拥有这5000行时,您可以使用服务GetRowsState(索引,金额)的方法,以及相同的故事,它只是说您行的最后更新时间,当您收到更高时间或其他客户时,然后再一次从GetRows服务器更新客户端数据状态。