xhr failed本质是vscode客户端发往微软服务器的http请求被网络层中断,非插件问题;常见于国内直连失败、代理配置错误、tls握手被rst或dns解析异常,需优先验证curl通路并正确配置settings.json中的http.proxy(须带协议前缀)及extensions.gallery.serviceurl(需配对且末尾含斜杠)。

XHR failed 本质是请求链路断了,不是插件问题
看到 XHR failed 别急着重装插件——这是 VSCode 客户端发往 marketplace.visualstudio.com 或 vscode-api 的 HTTP 请求被网络层中断的信号。国内直连微软服务器时,DNS 解析慢、TLS 握手被 RST、出口网关限速都可能触发它。
常见表现包括:插件列表空白、点“Install”后状态栏卡在“正在安装…”、Network 面板里请求状态为 (failed) net::ERR_CONNECTION_TIMED_OUT 或 net::ERR_CONNECTION_RESET。
- 先用终端验证基础通路:
curl -I https://marketplace.visualstudio.com,超时就不是 VSCode 的锅 - VSCode 不读系统代理或
HTTP_PROXY环境变量,只认settings.json里的http.proxy -
http.proxy值必须带协议前缀(http://127.0.0.1:7890),写成127.0.0.1:7890会被静默忽略 - Windows/macOS 默认绕过
localhost和127.0.0.1,即使开了 Clash/Fiddler,请求也可能根本没进代理进程
serviceUrl 配错导致静默 404 和无限重试
改了 extensions.gallery.serviceUrl 还卡在“重试中”?大概率是 URL 格式或配套项缺失。VSCode 扩展系统会并发请求服务根地址、插件详情页、缓存清单等多个端点,漏一个就崩。
关键细节:
- 必须同时配置
extensions.gallery.serviceUrl和extensions.gallery.cacheUrl,两者值要完全一致 - URL 末尾必须带斜杠,例如
"https://vscode.cdn.azure.cn/extensionGallery/extensionGallery/",少一个/就返回 404,VSCode 不报错,只默默重试 - 路径大小写敏感:
extensionGallery不能写成extensiongallery - 改完必须彻底退出所有 VSCode 进程(包括托盘和 Helper),再重启才生效
Remote-SSH 场景下 XHR failed 和本地完全无关
你在本地点了“更新 Python 插件”,实际执行的是远程服务器上的 vscode-server 进程。它不继承你的 shell 环境,也不读你本地 VSCode 的代理设置。
排查重点在远程机器:
- 编辑远程服务器上的
~/.vscode-server/data/Machine/settings.json(注意是Machine,不是User) - 写入有效的
http.proxy,比如{"http.proxy": "http://192.168.1.100:7890"},地址必须是远程机器能直连的局域网 IP,不能用127.0.0.1 - 必须断开并重连 Remote-SSH,否则
vscode-server不会重新加载配置 - 如果公司内网有白名单,确认
marketplace.visualstudio.com和vscode.blob.core.windows.net已放行
手动安装 .vsix 失败常因校验阶段被拒
双击 .vsix 没反应、提示 “Download failed” 或 “Signature verification failed”,不是网络问题,而是 VSCode 在加载前做了三道校验。
常见原因:
-
.vsix文件损坏或下载不完整:检查文件大小,官方扩展通常 ≥ 50KB;小于 10KB 基本是截断了 - 引擎版本越界:解压 .vsix,打开根目录
package.json,确认engines.vscode字段值 ≤ 当前 VSCode 版本(如你用1.90.0,插件写"^1.92.0"就会被拒) - 签名不兼容:某些旧版插件在新 VSCode 上报
Signature verification failed,可临时关闭extensions.experimental.affinity - 系统未关联 .vsix:双击无反应说明没绑定到 VSCode,改用命令面板运行
Extensions: Install from VSIX手动选文件
真正容易被忽略的是:http.proxy 和 extensions.gallery.serviceUrl 是两套独立机制,不能互相替代;前者走代理链路,后者换源站,混用反而容易冲突。调试时建议每次只改一项,彻底退出进程再验证。











