Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET HttpClient不会对并行请求重用tcp连接_.net - Fatal编程技术网

.NET HttpClient不会对并行请求重用tcp连接

.NET HttpClient不会对并行请求重用tcp连接,.net,.net,我有以下nodejs服务器。它仅在HTTP上提供json,并在建立新tcp连接时记录: var http = require('http'); var response = [{"name":"Alice"},{"name":"Bob"}]; var count=0; http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/json'}); res.end(JSON.string

我有以下nodejs服务器。它仅在HTTP上提供json,并在建立新tcp连接时记录:

var http = require('http');

var response = [{"name":"Alice"},{"name":"Bob"}];
var count=0;
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/json'});
  res.end(JSON.stringify(response));
}).on('connection', function(socket) {
  console.log('new TCP stream is established ' + count)
  count++;
  socket.setTimeout(5000);
}).listen(5000);
我用下面的C程序查询这个服务器,该程序启动10个http请求,不等待它们的响应

//to check connection reuse across processes
Console.WriteLine("ProcessID " + Process.GetCurrentProcess().Id);

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://mypc.domain.com:5000");

for (int i = 0; i < 10; i++)
{
    var result = client.GetAsync("/"); // or client.GetAsync("/").Result
    Console.Writeline("requested " + i);
}
当我运行它时,我会看到以下输出:

已建立新的TCP流0 . . 建立了新的TCP流9

它创建了10个tcp连接

现在,当我在服务器上设置的5秒超时下快速连续运行C程序时。我看不到正在创建任何新的TCP连接。这10个新请求重用上一次运行的TCP连接


有没有办法让HttpClient只为并行请求创建和重用一个TCP连接?
是否可以在同一TCP连接上进行并行请求?

因为您启动请求的速度非常快,它们都需要新的连接。不应存在任何不保证但可能重复使用的情况

现在当我连续快速运行C程序时

不存在跨进程的连接重用。这里没有重用。不管你怎么想,你发现这是真的——事实并非如此。我不熟悉node


有没有办法让HttpClient只为并行请求创建和重用一个TCP连接

TCP连接只能通过流水线并行运行多个HTTP请求,这不是一种确定的优化方法。我认为可以使用.NET打开HTTP管道

是否可以在同一TCP连接上进行并行请求

是的,通过管道

我认为管道不一定是您的目标,因为它还序列化响应

您可能应该依赖HTTP keep-alive,我认为它在默认情况下是启用的。现有的10个TCP连接没有任何危害。如果您稍微更改一下程序,您将看到100%的重用:

for (int i = 0; i < 10; i++)
{
    var result = client.GetAsync("/").Result; //Wait here
    Console.Writeline("requested " + i);
}
或:


因为您启动请求的速度非常快,所以它们都需要新的连接。不应存在任何不保证但可能重复使用的情况

现在当我连续快速运行C程序时

不存在跨进程的连接重用。这里没有重用。不管你怎么想,你发现这是真的——事实并非如此。我不熟悉node


有没有办法让HttpClient只为并行请求创建和重用一个TCP连接

TCP连接只能通过流水线并行运行多个HTTP请求,这不是一种确定的优化方法。我认为可以使用.NET打开HTTP管道

是否可以在同一TCP连接上进行并行请求

是的,通过管道

我认为管道不一定是您的目标,因为它还序列化响应

您可能应该依赖HTTP keep-alive,我认为它在默认情况下是启用的。现有的10个TCP连接没有任何危害。如果您稍微更改一下程序,您将看到100%的重用:

for (int i = 0; i < 10; i++)
{
    var result = client.GetAsync("/").Result; //Wait here
    Console.Writeline("requested " + i);
}
或:


我感到非常震惊,它根本就没有连接。你确定你没有失去第二次测试的输出吗?如果在createServer中放置一个console.log,您会处理多少个响应,10个还是20个?没错,在发出任何请求之前程序会退出。我在LinqPad上试过这个,它显然让进程保持运行。但是如果我按顺序发出请求,我可以从.exe运行第二次运行,但仍然只能看到从第一次运行创建的一个tcp连接。我不确定我是否理解您为什么要对所有内容重复使用一个连接,尤其是在客户端代码的fire and forget样式下。GetAsync正在返回一个任务对象,任务完成时将填充其结果属性。如果在继续之前需要结果,请使用非异步模式。@Spivonious fire and forget样式用于演示目的。此外,我需要的结果与异步与非异步无关。我可能需要这10个请求的结果,但仍然可以并行进行。我没有发现任何问题。并行请求的TCP连接?是否可以在同一TCP连接上进行并行请求?是的,但另一端的设计必须能够处理它。而且它们不会真正并行,只是一堆消息排成一个队列,按顺序处理。我很震惊它竟然重用了连接。你确定你没有失去第二次测试的输出吗?如果在createServer中放置一个console.log,您会处理多少个响应,10个还是20个?没错,在发出任何请求之前程序会退出。我在LinqPad上试过这个,它显然让进程保持运行。但是如果我按顺序发出请求,我可以从.exe运行第二次运行,但仍然只能看到从第一次运行创建的一个tcp连接。我不确定我是否理解为什么要对所有内容重复使用一个连接,特别是在客户端c的fire and forget样式下
颂诗GetAsync正在返回一个任务对象,任务完成时将填充其结果属性。如果在继续之前需要结果,请使用非异步模式。@Spivonious fire and forget样式用于演示目的。此外,我需要的结果与异步与非异步无关。我可能需要这10个请求的结果,但仍然可以并行进行。我没有发现任何问题。并行请求的TCP连接?是否可以在同一TCP连接上进行并行请求?是的,但另一端的设计必须能够处理它。此外,它们也不会真正并行,只会有一堆消息在队列中排队,并按顺序进行处理。令人惊讶的是,进程之间存在连接重用。我尝试了顺序程序,结果很好。节点服务器仅跨多个exe运行创建了一个tcp连接。感谢您对管道的评论。我会研究一下,或者只是考虑把事情串联起来。我敢打赌你的钱没有再用。在.NET或Windows中没有实现这一点的机制。您的度量是错误的,或者您没有在新流程中启动新请求。你最终会发现是哪一个。啊,看起来是Fiddler导致了连接重用。关闭它会为每个运行创建一个新的运行:这就对了:严格地说,我的两种可能性都不符合这种特定的故障模式。我猜你还是会赢的。令人惊讶的是,进程之间存在连接重用。我尝试了顺序程序,结果很好。节点服务器仅跨多个exe运行创建了一个tcp连接。感谢您对管道的评论。我会研究一下,或者只是考虑把事情串联起来。我敢打赌你的钱没有再用。在.NET或Windows中没有实现这一点的机制。您的度量是错误的,或者您没有在新流程中启动新请求。你最终会发现是哪一个。啊,看起来是Fiddler导致了连接重用。关闭它会为每个运行创建一个新的运行:这就对了:严格地说,我的两种可能性都不符合这种特定的失败模式。我想你还是会赢的