.NET Core 6中ClientWebSocket.ConnectAsync连接耗时超2秒求助
解决ClientWebSocket连接Chrome DevTools协议延迟问题
针对你遇到的.NET Core 6控制台应用中ClientWebSocket连接Chrome DevTools协议端点耗时超2秒的问题,试试下面这些实操方案:
替换localhost为127.0.0.1
大概率是DNS解析延迟导致的,localhost会优先尝试IPv6地址(::1),如果Chrome DevTools没监听IPv6,就会等待超时后再切换IPv4。直接用ws://127.0.0.1:9222/devtools/page/08F1...D2D2连接,跳过DNS解析的坑。禁用系统代理
ClientWebSocket默认会读取系统代理设置,Postman可能没启用代理,导致连接走了不必要的代理链路。在代码里关闭代理:using var socket = new ClientWebSocket(); socket.Options.Proxy = null; socket.Options.UseDefaultCredentials = false;强制使用IPv4
可以通过代码禁用IPv6优先,避免解析延迟:// 在程序启动时添加 AppContext.SetSwitch("System.Net.Sockets.Dns.EnableIPv6", false); // 然后正常连接 var webSocketDebuggerUrl = "ws://localhost:9222/devtools/page/08F1...D2D2"; using var socket = new ClientWebSocket(); // ... 连接代码添加底层日志排查卡点
要获取ClientWebSocket的内部日志,可借助.NET的日志系统和自定义HttpHandler:- 先安装
Microsoft.Extensions.Logging.Console包 - 添加日志配置和自定义Handler:
using Microsoft.Extensions.Logging; using System.Net.Http; var loggerFactory = LoggerFactory.Create(builder => { builder.AddConsole().SetMinimumLevel(LogLevel.Trace); }); var logger = loggerFactory.CreateLogger<Program>(); var handler = new SocketsHttpHandler(); // 捕获底层连接日志 handler.Logging = (msg) => logger.LogTrace("WebSocket底层日志: {Msg}", msg); var webSocketDebuggerUrl = "ws://localhost:9222/devtools/page/08F1...D2D2"; using var socket = new ClientWebSocket(); socket.Options.HttpMessageHandler = handler; var sw0 = new Stopwatch(); sw0.Start(); await socket.ConnectAsync(new Uri(webSocketDebuggerUrl), CancellationToken.None); sw0.Stop(); Console.WriteLine($"connect {sw0.ElapsedMilliseconds}");
运行后查看控制台的Trace日志,就能看到连接过程中卡在哪个环节(比如DNS解析、握手、等待响应等)。
- 先安装
手动解析DNS后连接
提前解析出localhost对应的IPv4地址,直接用IP拼接连接地址:var uri = new Uri("ws://localhost:9222/devtools/page/08F1...D2D2"); // 获取IPv4地址 var ipAddresses = await Dns.GetHostAddressesAsync(uri.Host); var ipv4 = ipAddresses.First(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork); // 拼接新的连接地址 var directUrl = new Uri($"ws://{ipv4}:{uri.Port}{uri.PathAndQuery}"); using var socket = new ClientWebSocket(); var sw0 = new Stopwatch(); sw0.Start(); await socket.ConnectAsync(directUrl, CancellationToken.None); sw0.Stop(); Console.WriteLine($"connect {sw0.ElapsedMilliseconds}");
内容的提问来源于stack exchange,提问作者user2845090
相关产品推荐
相关产品推荐

