我正在设计一个返回所有订单状态的WCF接口(订单数据结构包括两个成员,一个字符串类型ID和一个enum orderstatus,并设计为DataContract),订单总数非常大,约为10M。如果客户端调用此接口API以获取所有订单状态并且后续调用此API,我对服务器端的流量和影响感到担忧。
有什么建议吗?
我正在使用VSTS 2008 + C#+。Net 3.5 + WCF。
答案 0 :(得分:3)
我会支持ozczecho - 为什么你想要返回10M记录?您的客户真的想要筛选10M订单吗?我非常怀疑......
限制数量 - 例如日期范围(1Q / 09的所有订单)或任何其他标准。仅仅因为你可以返回10M行并不意味着它真的是个好主意。
此外,与SQL Server一起,您可以轻松实现分页,例如您可以让您的WCF服务发回第一个例如100行,并发回一个标志,表明有更多,然后让你的客户端请求行101到200等。它需要一些逻辑,但它会使通信更容易(和更快)!
此外,在WCF中,您必须定义最大邮件大小 - 它们通常为64K。其原因在于,在能够被传输之前,需要在存储器中完整地组装消息。想象一下,你有50个客户端命中你的服务器 - 你真的可以为服务器上的“消息组装”留出多少内存?
马克
<强>更新强>
在服务中实现分页的一种方法是通过这样的调用:
[OperationContract]
public List<Orders> GetOrders(string searchCriteria, string sortExpression,
int skipFirstRows, int takeRows)
这是受LINQ引入的.Skip()和.Take()扩展方法的启发。
在这种情况下,您可以调用GetOrders并定义一些搜索条件(也可能是一个类,而不仅仅是一个字符串)来匹配您的订单,您可以通过指定{{1}来定义如何对订单进行排序然后告诉服务你要跳过前n行,然后取x行。
所以打电话
sortExpression
将获取前50行。完成后,您可以再次致电:
List<Orders> result = GetOrders(criteria, sort, 0, 50)
现在你跳过前50行(你已经显示/报告过),然后你接下来的50行(51-100行)。
当然,如果后端的WCF服务使用LINQ,您可以直接将其转换为对LINQ查询的.Skip()和.Take()调用! : - )
更新2:
您是否正在使用SQL Server 2005或更高版本?查看公用表表达式(CTE),它们基本上是LINQ的基础。这允许您在数据上定义“虚拟”视图,并仅选择数据集的某个部分。
在此处查看更多信息:
答案 1 :(得分:2)