我需要从C#客户端应用程序向Web服务发送大约10,000个小的json字符串,然后将其插入到数据库中。
我的问题:发送大量小请求是否更好?还是有办法发送整个/多个大块?
我试图避免这样的事情:
List<Thing> things_to_update = get_things_to_update(); // List now contains 10,000 records
foreach (Thing th in things_to_update)
{
// POSTs using HttpWebRequest or similar
post_to_web_service(th);
}
答案 0 :(得分:1)
如果您控制服务器并且可以更改代码,则最好将它们分批发送。
只需将对象编码为json对象并将它们放入数组中即可。所以不要像
那样发送数据data={ id: 5, name: "John" }
使它成为一个数组
data=[{ id: 5, name: "John" }, { id: 6, name: "Jane" }, ...]
然后在服务器端的Controller操作中解析它并插入它。为了更清晰,更易于维护的代码,您应该创建一个处理多个请求的新Action。
我建议将它分成1000或2000的较小批次,而不是一次发送所有10000。使用Linq轻松完成:
int batchSize = 1000;
for(int i=0; i<things_to_update.Count; i+= batchSize) {
List<Thing> batch = things_to_update.Take(batchSize).Skip(i);
post_to_web_service(batch);
}
答案 1 :(得分:0)
发布整个List<Thing>
。
答案 2 :(得分:0)
我相信C#中的字符串通常是20个字节+它的长度的2倍。
这可能不完全正确,只是为了得到一个粗略的近似值:
假设你的“小”(?)json字符串长约100个字符,那么应该产生10'000个字符串对象,每个字符串大约220字节,这导致总大小为2'200'000字节,约2兆字节。
换句话说,不是太多。我肯定更愿意与您的网络服务建立10'000个连接。如果由于某种原因2 mb太多而无法接受你的WS,你总是可以把它分成几个较小的包装,比如1mb,或200kb等。我毫不怀疑你还会比起尝试每次发送10'000个字符串,可以获得更好的性能。
所以,是的,将你的字符串放在一个(或一小撮)数组中,然后批量发送。