如果未写入响应,则共享 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 的工作方式无关,实际上是与浏览器相关的怪癖。
我有这个代码:
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 的工作方式无关,实际上是与浏览器相关的怪癖。