【问题标题】:What happens when I call URLSessionTask's task.cancel()?当我调用 URLSession 任务 task.cancel() 时会发生什么?
【发布时间】:2019-12-13 21:09:19
【问题描述】:

reference for this method 只说明客户端本地发生的情况,并没有说明它可能发送到服务器的内容。显然,当我们取消请求时,我们的服务器在接收 大量 status code 499 时遇到了一些挑战,但我找不到有关 URLSession 如何处理取消的任何信息。是否有基于 HTTP 协议的标准取消消息?

【问题讨论】:

标签: ios http nsurlsession urlsession nsurlsessiontask


【解决方案1】:

客户端不发送 499。状态码是单向的。相反,客户端关闭网络连接。服务器在其日志中将断开连接记录为 499 状态代码。

如果服务器是 HTTP/2 或更高版本,客户端可能会发送 END_STREAM 或 RST_STREAM 消息来取消单个请求而不取消同一连接上的其他请求,或者它可能会直接断开连接。无论哪种方式,您可能只会在日志中看到 499。几乎没有理由关心连接是断开还是取消。

【讨论】:

  • 所以END_STREAM 导致单个请求结束,而RST_STREAM 导致整个连接结束? RST 代表什么?但是客户端最终不需要一个状态码来处理它的请求吗?我想 URLSession 会为它生成一些 4xx
  • 我的理解是,当它不再关心流时,通常应该发送 END_STREAM ,而另一端则应发送 RST_STREAM 作为响应以指示流不再有效。如果任一端检测到一些它无法处理的错误,它应该发送 RST_STREAM,它会立即断开流,并且不需要来自另一端的响应。两者都不会导致实际的网络套接字关闭。
  • 如果连接被取消,在 NSURLSession 级别不需要状态码,因为要么 A. 已经收到来自服务器的初始响应,在这种情况下请求已经有状态码,或 B. 尚未收到,在这种情况下,为您的应用提供状态代码的回调将永远不会被调用,因为该请求已被取消。
  • @dgatwood 它与我们可能从 NSURLSession 级别获得的 NSURLErrorCancelled 错误代码有什么关系? developer.apple.com/documentation/foundation/…
  • 只有远亲。当应用程序在任务上显式调用 -cancel-cancelByProducingResumeData:(或取消整个会话)时,您将在提供给任务完成处理程序的任何 NSError 对象中看到该错误代码,并且您还将看到它们已记录由当时的底层NSURL 机器。如果您访问已取消任务的错误属性,您也会看到它们。流终止事件可能会被发送,但前提是仍然存在可以发送它的连接。从服务器端取消应该导致NSURLErrorNetworkConnectionLost AFAIK。
猜你喜欢
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多