如果未写入响应,则共享 HTTP 服务器不会处理

Shared HTTP Servers not processing if response is not written into

我有这个代码:

void handle(HttpRequest request) async {
  request.response.write('Hello');
  await Future.delayed(Duration(seconds: 5));
  request.response.close();
}

void main() {
  var server = await HttpServer.bind(InternetAddress.loopbackIPv4, 8080);
  server.listen(handle);
}

并且正常工作,所有的请求都是同时处理的,现在我想知道为什么如果我把response.write移到Future之后,它只能处理一个请求在时间。

我只能在 Chromium 浏览器中重现此问题,在 Internet Explorer、Edge 或 CURL 请求中不会发生这种情况。

void handle(HttpRequest request) async {
  print('Request on ${Isolate.current.hashCode}');
  await Future.delayed(Duration(seconds: 5));
  request.response.write('Hello');
  request.response.close();
}

如果有修复(在 Future 之后留下 response.write)或任何关于为什么会发生这种情况的解释,欢迎提供任何信息。

像这样修改了您的代码:

void handle(HttpRequest request) async {
  print('A');
  await Future.delayed(Duration(seconds: 5));
  print('B');
  request.response.write('Hello');
  print('C');
  request.response.close();
}

2 个选项卡在 chrome 中打开,正在发送请求。人们会期望在控制台中看到 A-A-B-C-B-C,但实际上并非如此:A-B-C-A-B-C。 @julemand101 指出,它与 Chrome 如何处理 connections/caches... 有关。如果你在开发工具中禁用缓存,你会得到你期望的结果。所以它与 Dart 的工作方式无关,实际上是与浏览器相关的怪癖。