You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HttpListener偶现ERR_CONNECTION_REFUSED问题求助

排查思路
  • 检查端口复用与TCP连接状态
    虽然HttpListener能获取上下文,但可能存在TIME_WAIT状态的连接占用端口,导致Chrome发起新请求时暂时无法建立连接。可以用netstat -ano | findstr :<你的端口号>命令查看端口的连接状态,确认是否有大量TIME_WAIT的连接。如果是,尝试设置Listener的ExclusiveAddressUse为false,或者在启动前先清理残留的连接(比如结束占用端口的无关进程)。

  • 验证HttpListener的响应完整性
    浏览器不渲染页面,大概率是响应头或响应体不规范导致Chrome拒绝解析。检查你的响应代码:

    • 必须发送完整的HTTP响应头,比如Content-Type要正确设置为text/html; charset=utf-8,Content-Length要和响应体长度严格匹配;
    • 响应结束后要确保调用response.Close()或response.OutputStream.Close(),避免连接处于半开状态;
    • 不要在响应发送完成前提前关闭Listener,确保响应完全发送给浏览器后再停止监听。
  • 排查Chrome的本地缓存与进程隔离
    Chrome的缓存或孤立进程可能导致请求异常:

    • 尝试在隐私模式下测试,排除缓存和扩展的干扰;
    • 关闭所有Chrome进程(包括后台进程)后重新打开,避免旧进程持有无效的localhost连接;
    • 查看Chrome的chrome://net-internals/#events日志,追踪请求的详细流程,确认是连接阶段失败还是响应解析阶段失败。
  • 优化HttpListener的启动与请求处理时机
    确保Listener完全启动后再打开浏览器:

    • 不要在调用listener.Start()后立即启动浏览器,可通过listener.Prefixes确认监听前缀已生效,或者用Task.Delay(200).Wait()等待一小段时间(比固定Sleep更可靠);
    • 处理请求的线程要避免阻塞,建议用异步方式(比如await listener.GetContextAsync())处理请求,防止线程卡顿导致响应超时。
  • 检查代码中的资源泄漏
    多次调用后出现问题,可能是资源未正确释放:

    • 每次处理完请求后,用using语句包裹相关对象,确保资源被及时释放:
      using (var context = await listener.GetContextAsync())
      using (var response = context.Response)
      {
          // 处理响应逻辑
      }
      
    • 避免多次启动Listener而未正确停止,确保每次认证流程结束后调用listener.Stop()和listener.Close(),释放端口资源。
  • 测试不同端口与监听前缀
    尝试更换监听端口(比如从8080换成其他未被占用的端口),或者修改监听前缀为更明确的格式,比如http://localhost:xxxx/auth/callback/(注意末尾的斜杠),避免前缀匹配问题导致请求无法正确路由到Listener。

内容的提问来源于stack exchange,提问作者gjvdkamp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:12:09