REST请求执行超2分钟触发Request aborted异常排查
问题原因分析
这个错误的核心是请求超时:RestSharp底层依赖的HttpClient默认请求超时时间通常为100秒(约1分40秒),部分环境或版本下为2分钟,当服务端接口执行时长超过这个阈值时,客户端会主动取消请求,抛出TaskCanceledException并包装为HttpRequestException(提示Request aborted)。
另外WSL环境存在特殊情况:WSL与主机之间的网络转发可能有默认超时设置,或者Python服务所在的Web框架未配置长连接超时,导致服务端虽执行完成,但客户端已因超时断开连接。
解决配置调整
1. 调整RestSharp客户端超时时间
可以通过全局或单个请求两种方式设置更长的超时,覆盖默认值:
全局设置(针对整个RestClient)
public MyService(...) { var options = new RestClientOptions(url) { // 设置超时为10分钟(单位:毫秒) Timeout = 600000 }; _restClient = new RestSharp.RestClient(options); }
单个请求设置(仅针对do接口)
如果只有该接口需要长超时,可单独配置:
public async Task DoAsync() { try { var request = new RestRequest("do") { // 设置该请求超时为10分钟 Timeout = 600000 }; request.AddJsonBody(/*data*/); var res = await _restClient.PostAsync<int>(request).ConfigureAwait(false); ... } catch (Exception ex) { // log throw; } }
2. 调整Python服务端Web框架超时
确保服务端允许长请求执行:
- Flask + Gunicorn:启动时设置超时参数
# 示例:设置超时为10分钟 gunicorn --timeout 600 app:app - Django + uWSGI:修改uWSGI配置文件
# 设置请求超时为10分钟 harakiri = 600
3. 排查WSL网络层面超时
WSL与Windows主机的网络转发可能存在默认超时,可做以下调整:
- 临时关闭Windows防火墙测试(仅用于排查是否是防火墙拦截长连接)
- 修改WSL的TCP心跳参数:编辑
/etc/sysctl.conf,添加以下内容后执行sudo sysctl -p生效
这些参数让TCP连接定期发送心跳包,避免被中间网络设备断开。net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_keepalive_intvl = 60 net.ipv4.tcp_keepalive_probes = 10
额外建议
- 超时时间不要设置过长,根据业务实际最长执行时长配置(比如接口最长跑5分钟,就设6分钟超时)
- 对于超长时间任务,建议改用异步任务模式:客户端先提交任务获取任务ID,后续通过轮询或WebSocket获取结果,避免长时间占用HTTP连接
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

