You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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>
      
  • 无超时的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:51:12