当你在本地开发环境中遇到“用 localhost
可以访问,但用本机 IP(如 192.168.0.138
)时被拒绝连接”的问题时,可能是以下原因导致的:
1. 检查 Kestrel 绑定的 IP 地址
默认情况下,ASP.NET Core 的 Kestrel 服务器只绑定到 localhost
(即 127.0.0.1
)。这意味着它只接受来自本地计算机的请求,而拒绝来自其他 IP 地址的请求。
解决方法:
在 Program.cs
中,明确配置 Kestrel 监听所有 IP 地址,或指定你的本机 IP 地址。
例如,添加 UseUrls
来配置 Kestrel 监听所有网络接口:
var builder = WebApplication.CreateBuilder(args);
// http://0.0.0.0:5000 表示 Kestrel 监听所有 IP 地址上的 5000 端口。
builder.WebHost.UseUrls("http://0.0.0.0:5000"); // 或者指定本机IP "http://192.168.0.138:5000"
// 配置 Kestrel 服务器以监听所有 IP 地址和端口
builder.WebHost.ConfigureKestrel(serverOptions =>
{
// 监听所有 IP 地址和指定端口(例如:5000)
serverOptions.ListenAnyIP(5000);
// 或者,你可以添加多个监听端口
serverOptions.ListenAnyIP(5001);
serverOptions.ListenAnyIP(5002);
// 监听所有 IP 地址的任意可用端口
// 如果需要动态分配端口(不推荐),可以使用以下代码:
// serverOptions.ListenAnyIP(0); // 0 表示由操作系统动态分配端口
});
var app = builder.Build();
// 其他配置...
app.Run();
这样,Kestrel 将监听所有网络接口(包括本地和网络 IP 地址),而不仅仅是 localhost
。
注意:监听大量端口可能会耗尽系统资源并导致安全隐患。这通常不是一个推荐的做法,尤其是在生产环境中。
2. 检查防火墙设置
Windows 防火墙或其他防火墙软件可能阻止了来自本机 IP 地址的连接。
解决方法:
- 打开 Windows 防火墙设置,检查是否允许你的应用程序或 Kestrel 通过防火墙。
- 如果使用第三方防火墙,请确保它不会阻止端口 5000(或其他你使用的端口)的连接。
3. 确保没有其他服务占用了同一端口
确认没有其他服务占用了你配置的端口。例如,确保没有其他服务在端口 5000
上运行,导致 Kestrel 无法正确绑定。
解决方法:
- 通过命令行检查端口占用情况:
netstat -an | findstr :5000
- 如果端口被占用,尝试更改端口号或关闭占用该端口的服务。
4. 网络配置问题
如果你的计算机连接到多个网络(例如有线和无线),确保你访问的 IP 地址是当前网络下的正确 IP 地址。
解决方法:
- 使用
ipconfig
命令检查当前网络下的正确 IP 地址。 - 确保没有网络适配器设置错误或 IP 地址冲突。
5. 使用 http://localhost:5000
测试
首先使用 localhost
测试你的应用程序。如果 localhost
可以工作但 IP 地址不行,请重点检查上面提到的 Kestrel 配置和防火墙设置。