【问题标题】:How do asynchronous GET requests work?异步 GET 请求如何工作?
【发布时间】:2016-05-27 04:09:35
【问题描述】:

我认为我从高层次的角度理解了异步 POST 方法的基本原理。最大的优势是调用者可以快速响应,即使来自 POST 的数据处理可能还没有完成。

但我真的不明白这如何应用于 GET 方法。响应需要包含数据,那么在处理完成之前怎么会有响应呢?为什么要有一个带有使用异步方法的 GET 请求处理程序的 API?

我认为这种一般类型的问题并不重要,但我正在使用 Web API 用 C# 编写。

【问题讨论】:

  • 释放当前线程,同时IO/网络操作异步进行。 GET 或 POST 对此没有任何影响。在任何一种情况下,您都在向 Web 服务器请求某些内容,并且您会得到某种形式的响应。是否有有效载荷无关紧要。
  • 你确定你知道 await 是做什么的吗?许多人认为它会在后台线程上启动一些工作,这会导致混乱。

标签: c# asynchronous asp.net-web-api


【解决方案1】:

在网络上没有异步 HTTP 调用之类的东西。它只是通过 TCP 传输的数据。服务器无法判断客户端是内部同步还是异步。

来电者得到快速响应

确实,服务器可以提前发送响应行和标头,延迟发送数据。但这与异步 IO 或异步 .NET 服务器实现无关。只是一些字节提前到达和一些延迟到达。

所以这里 GET 和 POST 没有区别。

为什么...使用异步方法?

它们可以为客户端和/或服务器带来可扩展性优势。 HTTP 级别没有区别。

【讨论】:

  • 当然,但是服务器可以(1)启动一个异步进程,(2)向客户端返回数据,(3)关闭连接,然后(4)完成异步工作。我认为这就是 OP 所要求的。
  • @AaronBrager 我现在认为我们都误解了。
  • 让我澄清一些困惑,因为我猜这个问题很模糊。有两件事让我问这个问题。一种是在 Identity MVC 示例代码的 AccountController 中使用异步端点。我知道编写该代码的人比我更了解,我只是没有得到使这么多端点异步的目的。另一种是在端点中使用 EntityFramework ToListAsync,正如我在各种示例中看到的那样。但是,如果可以在检索数据时发送响应,那就更有意义了。
  • @SteveWash 好的,我的回答似乎适用。异步的这些用法对客户端的影响为零。客户端没有更快地获得单个字节。此外,没有并行的或“一劳永逸”的工作正在完成。这是一个使用异步 IO 来实现可扩展性的案例。我想你不知道 await 做什么。 await 等待已经开始的事情完成。它不会启动任何东西。这有帮助吗?
  • 肯定有帮助,尤其是对可扩展性的解释。我推测可伸缩性会提高,因为线程返回到应用程序池。归根结底,在检索数据时使用 async 和 ToListAsync 对服务器性能有一些好处,即使是相对较小的数据集也是如此。特别是对于高流量的网站。我认为许多人对“徘徊等待某事完成”这一主题的不准确心理形象使这一点难以掌握。
【解决方案2】:

所以应用可以做其他不需要数据的事情。

如果您将 GET 实现为同步的(假设您在一个糟糕的网络上,需要 20 秒才能获得它),您不能

  1. 显示进度
  2. 允许用户取消
  3. 让他们启动其他 GET
  4. 让他们使用应用的其他部分

编辑(参见 cmets):服务器想要异步响应的原因大致相同(放弃线程)。实际上获取数据可能是异步的并且需要一些时间——你不会想一直阻塞线程。

【讨论】:

  • 听起来您在谈论为什么 client 会异步执行此操作。 (如果这是问题,你的回答很好。)不过,我的解释是,OP 询问为什么 server 会异步响应 GET 请求。
  • 我已经读了三遍了,我看不出来。我认为他们会选择对他们最有意义的答案。
  • 我想问为什么服务器会异步响应。感谢您指出这一重要区别。对于客户而言,您的回复非常有意义。
【解决方案3】:

如果您正在构建一个 RESTful API,其中 GET 应该返回一个资源(或一个集合)并且是幂等的(不进行任何更改),这没有任何意义。

但是如果您不遵循这些原则,GET 请求可能会异步执行一些工作。例如,GET /messages/3 可以将消息返回给客户端,然后异步执行其他工作,例如:

  • 将邮件标记为已读
  • 向用户的其他客户端发送推送通知,指示消息已读
  • 安排 30 天后的 cronjob 删除消息

这些都不会被视为 RESTful API,但仍会不时使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多