ClientWebSocket ConnectAsync协议异常:URL格式冲突问题求助
ClientWebSocket连接异常的解决方法
问题重现
你的代码:
using (ClientWebSocket socket = new ClientWebSocket()) { Uri serverUri = new Uri("wss://localhost:5079"); socket.ConnectAsync(serverUri, CancellationToken.None); }
调用ConnectAsync时抛出异常:
System.InvalidOperationException: 'Unrecognized scheme in server address 'ws://localhost:5079'. Only 'http://' and 'https://' are supported.'
但改用http/https格式的URL,程序又提示必须使用ws/wss协议。
核心问题与解决
1. 异步方法未等待(必改)
ConnectAsync是异步方法,你没加await会导致using块提前释放ClientWebSocket对象,直接引发异常或连接失败。不管用哪个.NET版本,都必须加上await。
2. 不同.NET版本的Uri协议支持差异
如果用的是.NET Framework:
ClientWebSocket不直接支持ws/wss协议的Uri,需要改用对应http/https的Uri(ws对应http,wss对应https),同时可按需设置WebSocket子协议:using (ClientWebSocket socket = new ClientWebSocket()) { Uri serverUri = new Uri("https://localhost:5079"); // wss对应https,ws对应http socket.Options.AddSubProtocol("websocket"); // 按需添加,部分服务器要求 await socket.ConnectAsync(serverUri, CancellationToken.None); }如果用的是.NET Core/.NET 5+:
直接支持ws/wss协议的Uri,只需补加await即可:using (ClientWebSocket socket = new ClientWebSocket()) { Uri serverUri = new Uri("wss://localhost:5079"); await socket.ConnectAsync(serverUri, CancellationToken.None); }
补充说明
你看到的异常里显示的是ws://localhost:5079,但代码里写的是wss,应该是测试时切换过协议导致的,本质还是协议格式和异步方法未等待的问题。
内容的提问来源于stack exchange,提问作者Jacopo
相关产品推荐
相关产品推荐

