问题排查
【端口占用】
前言
关于端口占用的排查。
一、错误描述
- 出现报错异常:Exception Info: System.IO.IOException: Failed to bind to address http://localhost:5000.
二、原因分析
电脑的5000端口被占用导致
三、解决方法
1.检查端口是否被占用
- 以管理员身份运行cmd
- 使用netstat命令:netstat -aon | findstr :5000
输出如下

- 使用tasklist命令查找该进程:tasklist /FI “PID eq 4”
输出如下

此时,正常的做法使用以下命令终止该进程:
taskkill /PID 4 /F
但是,从上面查找的输出看,这是System中的服务占用了端口,而不是某一个进程占用
这时我们需要继续排查是System中的哪一个服务占用端口
可以使用PowerShell查询详细信息
- 以管理员身份运行PowerShell
- 使用以下脚本可以列出所有监听端口及其对应的进程和服务名称:
$port = 5000
Get-NetTCPConnection -LocalPort $port -State Listen | ForEach-Object {
$processId = $_.OwningProcess
$process = Get-Process -Id $processId -ErrorAction SilentlyContinue
$service = Get-CimInstance Win32_Service | Where-Object { $_.ProcessId -eq $processId }
[PSCustomObject]@{
LocalPort = $_.LocalPort
ProcessName = $process.Name
ServiceName = $service.Name
ServiceDisplayName = $service.DisplayName
}
} | Format-Table –AutoSize
正常的输出如下:
LocalPort ProcessName ServiceName ServiceDisplayName
--------- ----------- ----------- ------------------
5000 System W3SVC World Wide Web Publishing Service
即可确定是服务W3SVC占用了端口
但是,实际的输出如下:

还是找不到是哪一个服务,那么可以怀疑这个端口与HTTP相关的服务有关(例如IIS或其他Web服务),可以使用netsh命令来查看详细的HTTP状态信息
- 以管理员打开cmd
- 查看HTTP服务状态
netsh http show servicestate

即可确定对应的服务,到IIS上停掉即可
因为实际应用中,这个服务也是需要用到的,不能停掉,所以在appsettings.json中更改使用的端口号解决,更改5000为5001
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5001"
}
}
}
}
总结
不积硅步,何以至千里


458

被折叠的 条评论
为什么被折叠?



