WSL2 Docker Redis无法通过.NET的localhost连接,换127.0.0.1正常
问题:.NET中用localhost连接WSL2 Docker里的Redis超时,换127.0.0.1却正常?
问题场景
- 在WSL2实例的Docker容器中运行redis-stack,端口已映射到Windows主机
- Windows主机可通过
http://localhost:8001访问Redis Insights,Git Bash中用localhost连接Redis执行命令也正常,WSL2内部也能正常访问Redis - 使用StackExchange.Redis NuGet包编写的xUnit测试,用
localhost连接时出现超时错误,日志显示Redis版本为v3.0.0(实际通过INFO命令返回的版本是7.4.0) - 将连接地址替换为
127.0.0.1后,测试完全正常
原因分析
- localhost解析优先级差异:Windows系统中,.NET程序默认优先将
localhost解析为IPv6地址::1,但你的Redis容器可能只监听了IPv4的127.0.0.1端口。当程序尝试用IPv6连接时,容器内的Redis没有响应,最终导致超时。而直接指定127.0.0.1会强制使用IPv4协议,自然能正常连接。 - 错误版本信息的来源:日志里的v3.0.0版本并非容器中Redis的真实版本,而是StackExchange.Redis在连接失败时返回的默认占位值,或者是本地残留的旧Redis服务缓存信息,和实际容器内的Redis无关。
- 不同工具的网络处理逻辑不同:Git Bash、浏览器等工具在解析
localhost时,会自动在IPv6连接失败时 fallback 到IPv4;但.NET的网络堆栈遵循系统默认的地址解析优先级,不会自动切换,因此出现了差异。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

