首页 > 解决方案 > 即使按顺序发送,HTTP 服务器是否有可能无序接收请求?

问题描述

(这个讨论可能不是特定于 C#...)

我有一个 C# 方法SendMultipleRequests,可以按顺序发送 10 次 HTTP POST 请求。服务器是否可以乱序接收请求?
如果我的理解是正确的,如果请求是同时发送的(不await带将按顺序接收请求。

public async Task SendRequest(int i) 
{
  // definition of endpoint is omitted in this example
  var content = new StringContent($"I am {i}-th request");
  await HttpClient.PostAsync(endpoint, content);
}

public async Task SendMultipleRequests() 
{
  for (int i = 0; i < 10; i++)
  {
    await SendRequest(i);
  }
}

标签: c#http

解决方案


await您的应用程序将等待 PostAsync 返回的任务在发出下一个请求之前完成 - 请参阅 postasync 文档,其中显示“此操作不会阻塞。返回的Task<TResult>对象将在读取整个响应(包括内容)后完成。” - 使用 await 意味着你只会在我阅读了上一个响应的内容后发出下一个请求

如果您删除等待,那么您的代码将排队十个任务并开始以某种未定义的顺序处理它们。服务器将以未指定的顺序查看请求。请求可能通过 Internet 采用不同的路由(速度较慢)这一事实可能会进一步加剧这种情况。如果您删除等待,那么您应该将返回的任务捕获到一个列表中,然后您可以使用类似 await Task.WhenAll(list) 的东西来等待它们全部完成(除非您真的想触发并忘记在这种情况下您可以将它们分配给丢弃_ = client.PostAsync...,但保留任务允许您发现和处理出现的异常)


推荐阅读