最有效的方法是为Web服务制作大量小型POST

时间:2014-02-18 12:42:26

标签: c# json winforms httpwebrequest

我需要从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);
}

3 个答案:

答案 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个字符串,可以获得更好的性能。

所以,是的,将你的字符串放在一个(或一小撮)数组中,然后批量发送。