【问题标题】:Post call limit of HttpGetRequestStreamHttp GetRequestStream 的发布调用限制
【发布时间】:2013-04-17 01:18:17
【问题描述】:

我试图弄清楚对“GetRequestStream”的调用是否有限制。

为了测试这一点,我创建了一个负载测试,其中包含 10 个代理和 1 个控制器,所有这些都试图进行 post call(对象大小 10kb)和 10 个用户计数。(下面的代码)。我没有调用“GetResponse()”来查看是否可以对 GetRequestStream 进行大量调用。

但实际发生的情况是,即使使用所有这些代理,负载测试也没有超过每秒 85 到 90 个请求,而争论点是代码“使用 (Stream requestStream = request.GetRequestStream())”中的这一行。

我将代理减少到 2 个,但结果相同。端点服务器是一个单一的服务器盒。当我使用 VIP(由后端的 3 台服务器支持)时,我得到了 3 倍的输出,即能够达到 270 RPS。 当我针对 VIP 再次将代理增加到 15 时,平均值仍然保持不变。所以我得出结论,在调用 GetRequestStream 期间使用了一些共享资源

基于较早的 SO 帖子 HttpWebRequest.GetRequestStream : What it does?

它提到对 GetRequestStream 的调用实际上阻塞了服务器端的一些资源,并且无论生成多少个 post 调用,它都只能服务这么多的请求。我曾经相信 GetRequestStream 不会进行任何调用,而只是获取一个流并将对象写入流中,当我们调用 GetResponse() 时会发生调用

HttpWebRequest request =
   (HttpWebRequest)HttpWebRequest.Create("http://some.existing.url");

request.Method = "POST";
request.ContentType = "text/xml";

Byte[] documentBytes = GetDocumentBytes ();


using (Stream requestStream = request.GetRequestStream())
{
   requestStream.Write(documentBytes, 0, documentBytes.Length);
   requestStream.Flush();
   requestStream.Close();
}

如果有人可以向我指出一些资源,我可以从中挖掘更多细节,或者如果有人可以解释这种行为,我将不胜感激。

【问题讨论】:

  • 找到更多信息:GetRequestStream 发送标头,等待 100-continue,并为您提供直接写入网络的流。每个 POST 都独占一个连接,直到您阅读并关闭响应。默认连接限制为每个 uri 2 个。

标签: c# http post httpwebrequest


【解决方案1】:

根据 http 1.1 RFC,HttpWebRequest 具有从客户端到主机的默认连接限制为两个 - 这可能会导致延迟下降超过两个并发用户。可以通过客户端进程的app.config更改,见herehere

猜你喜欢
  • 2018-04-07
  • 1970-01-01
  • 2011-01-25
  • 2016-04-29
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
相关资源
最近更新 更多