vscode运行asp.net core项目卡在eaddrinuse,95%是前次调试未退出干净导致kestrel残留监听5000/5001端口,应先用lsof -ni :5000(macos/linux)或get-nettcpconnection -localport 5001(windows)查pid,再taskkill /f /t /pid或kill -9终止进程树,并检查launchsettings.json中applicationurl配置的多个端口。

VSCode 运行 ASP.NET Core 项目时卡在 EADDRINUSE,根本不用重启或重装——95% 的情况是前一次调试没退出干净,Kestrel 进程还挂着监听 5000 或 5001,直接查 PID 杀掉就行。
查 macOS/Linux 上谁占了 5000 端口
别信“没进程在跑”,Kestrel 常静默残留。在 VSCode 内置终端里执行:
lsof -ni :5000
如果报 command not found: lsof,先运行:xcode-select --install(macOS)或 brew install lsof(Homebrew 用户)
常见输出里 PID 列是数字,COMMAND 列可能是 dotnet、Electron 或空——别只看名字,盯 PID 才准。
加 -n 是为了跳过 DNS 解析,避免卡住;-i 限定只筛网络连接,结果更干净。
Windows 上用 PowerShell 查 5001 端口更可靠
CMD 的 netstat -ano | findstr :5001 在新版 Windows 常无输出,不是没占,是命令没加载全。改用 PowerShell:
Get-NetTCPConnection -LocalPort 5001
输出里直接有 OwningProcess 字段,就是 PID。不用再切任务管理器比对。
如果返回空,不代表端口空闲——可能绑的是 ::1:5001(IPv6 localhost),而你新进程试图绑 127.0.0.1:5001,系统仍判冲突。
此时补查:Get-NetTCPConnection -LocalAddress ::1 | Where-Object { $_.LocalPort -eq 5001 }
确认是不是 VSCode 自家的 dotnet 进程
查到 PID 后,别急着 kill -9 或 taskkill /f。先确认归属:
- macOS/Linux:
ps -p 12345 -o comm=(把12345换成实际 PID),输出是dotnet或Electron,基本就是上一次调试残留 - Windows:
tasklist /fi "PID eq 12345",看Image Name列,dotnet.exe、Code.exe、CodeHelper.exe都算自家的 - 特别注意:
ControlCe(macOS 隔空播放接收器)也常抢5000端口,它不是 VSCode 进程,但关掉设置里“隔空播放接收器”就能释放
杀进程要分步,尤其防子进程漏网
Kestrel 启动后常派生子线程或日志进程,硬杀主 PID 容易留锁:
- macOS/Linux:先
kill 12345(发 SIGTERM),等 2 秒;没退出再kill -9 12345 - Windows:必须带
/t参数:taskkill /f /t /pid 12345,否则 npm/yarn 子进程可能继续占端口 - 彻底清场(多窗口调试后):
killall -r "dotnet|Code Helper|Electron"(macOS/Linux)或taskkill /f /t /im dotnet.exe(Windows) - 杀完立刻验证:
lsof -i :5000或Get-NetTCPConnection -LocalPort 5000应无输出
真正容易被忽略的是:ASP.NET Core 的 launchSettings.json 里 applicationUrl 可能同时写了 http://localhost:5000 和 https://localhost:5001,两个端口都要查。别只盯报错里写的那一个。











