.NET MAUI应用使用WebSocket抛出WebSocketException异常求助
.NET MAUI中ClientWebSocket抛出WebSocketException问题排查及解决
这段代码在.NET WinForms应用中可正常建立WebSocket连接、发送命令至服务器且服务器能正常接收,但在.NET MAUI中运行时会抛出System.Net.WebSockets.WebSocketException异常,相关代码如下:
private async void BtnOn_Clicked(object sender, EventArgs e) { await SendCommand("O"); } private async void BtnOff_Clicked(object sender, EventArgs e) { await SendCommand("F"); } private async Task SendCommand(string command) { ClientWebSocket socket = new ClientWebSocket(); try { await socket.ConnectAsync(new Uri("ws://192.168.0.2:80/command"), CancellationToken.None); byte[] buffer = Encoding.UTF8.GetBytes(command); await socket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None); Trace.WriteLine("Incoming message: " + command); // Receive response if needed var responseBuffer = new byte[1024]; var response = await socket.ReceiveAsync(new ArraySegment<byte>(responseBuffer), CancellationToken.None); var responseMessage = Encoding.UTF8.GetString(responseBuffer, 0, response.Count); } catch (Exception ex) { await DisplayAlert("Error", $"Error: {ex.Message}", "OK"); } finally { if (socket.State == WebSocketState.Open || socket.State == WebSocketState.Connecting) await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed by the client", CancellationToken.None); socket.Dispose(); } }
可能的原因及解决办法
- 网络权限未配置:MAUI是跨平台框架,不同平台需明确配置网络权限
- Android:在
Platforms/Android/AndroidManifest.xml中添加权限<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - iOS:在
Platforms/iOS/Info.plist中添加网络访问配置(允许非HTTPS连接)<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>192.168.0.2</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
- Android:在
- 无超时的CancellationToken:代码中使用
CancellationToken.None,MAUI中建议添加超时Token避免无限等待
修改连接和发送逻辑:using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); await socket.ConnectAsync(new Uri("ws://192.168.0.2:80/command"), cts.Token); - 连接状态检查缺失:在发送和接收前确认WebSocket状态是否为Open
在SendAsync前添加:if (socket.State != WebSocketState.Open) { throw new InvalidOperationException("WebSocket连接未处于打开状态"); } - 原生实现跨平台差异:MAUI中
ClientWebSocket底层实现与WinForms不同,可尝试替换为第三方库(如WebSocketSharp-netstandard)简化跨平台兼容问题
内容的提问来源于stack exchange,提问作者Carlos Costa
相关产品推荐
相关产品推荐

