Dart HttpServer设置Content-Type为text/html时服务冻结无响应问题咨询
故障根因
你在修改代码时出现了明确的对象引用错误,这也是导致服务冻结的直接原因:
- 你当前代码是把
Content-Type设置到了request.headers上,这个对象对应客户端发送到服务端的请求头,存储的是请求解析完成后的客户端元数据,你对它的修改完全不会传递到最终返回给客户端的响应内容里。 - 强行对
request.headers执行写入操作,会干扰DartHttpServer内置的请求状态机流转,导致服务端始终认为当前请求未处理完成,不会触发响应发送流程,最终表现为telnet、浏览器都收不到任何返回内容。
修复方法
Content-Type属于响应头配置,需要设置在响应对象request.response对应的headers上,修正后的可运行代码如下:
server.listen((request) async { final html = await indexHtml; // 正确为响应配置Content-Type request.response.headers.set("Content-Type", "text/html; charset=utf-8"); request.response.write(html); await request.response.close(); });
补充说明
- 初始版本的代码运行正常但返回纯文本,是因为Dart
HttpServer在没有手动指定响应MIME类型时,会默认给返回内容分配text/plain类型,浏览器自然会把HTML代码当作纯文本展示。 - 日常开发中不要尝试修改
request.headers中的任何字段:这个对象仅用于读取客户端的请求信息,不存在修改后生效的设计语义,强行写入不仅达不到配置目的,还容易触发服务内部状态异常。
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

