asp.net-core - flutter websocket连接问题

标签 asp.net-core websocket dart flutter

我正在尝试开发一个 flutter 应用程序,它连接到服务器并使用 websocket 交换数据。服务器位于.Net Core中,并使用Asp.Net Core Websockets来实现此功能。

我面临的问题是,我的 flutter 应用程序无法连接到服务器并引发以下错误。

E/flutter (31498): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (31498): WebSocketChannelException: WebSocketChannelException: WebSocketException: Connection to 'http://127.0.0.1/client#' was not upgraded to websocket
E/flutter (31498): #0      new IOWebSocketChannel._withoutSocket.<anonymous closure> (package:web_socket_channel/io.dart:83:24)
E/flutter (31498): #1      _invokeErrorHandler (dart:async/async_error.dart:13:29)
E/flutter (31498): #2      _HandleErrorStream._handleError (dart:async/stream_pipe.dart:286:9)
E/flutter (31498): #3      _ForwardingStreamSubscription._handleError (dart:async/stream_pipe.dart:168:13)
E/flutter (31498): #4      _RootZone.runBinaryGuarded (dart:async/zone.dart:1328:10)
E/flutter (31498): #5      _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:350:15)
E/flutter (31498): #6      _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:367:16)
E/flutter (31498): #7      _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:266:7)
E/flutter (31498): #8      _SyncStreamController._sendError (dart:async/stream_controller.dart:767:19)
E/flutter (31498): #9      _StreamController._addError (dart:async/stream_controller.dart:647:7)
E/flutter (31498): #10     _RootZone.runBinaryGuarded (dart:async/zone.dart:1328:10)
E/flutter (31498): #11     _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:350:15)
E/flutter (31498): #12     _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:367:16)
E/flutter (31498): #13     _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:266:7)
E/flutter (31498): #14     _SyncStreamController._sendError (dart:async/stream_controller.dart:767:19)
E/flutter (31498): #15     _StreamController._addError (dart:async/stream_controller.dart:647:7)
E/flutter (31498): #16     new Stream.fromFuture.<anonymous closure> (dart:async/stream.dart:110:18)
E/flutter (31498): #17     _RootZone.runBinary (dart:async/zone.dart:1386:54)
E/flutter (31498): #18     _FutureListener.handleError (dart:async/future_impl.dart:141:20)
E/flutter (31498): #19     Future._propagateToListeners.handleError (dart:async/future_impl.dart:649:47)
E/flutter (31498): #20     Future._propagateToListeners (dart:async/future_impl.dart:670:24)
E/flutter (31498): #21     Future._completeError (dart:async/future_impl.dart:489:5)
E/flutter (31498): #22     Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:537:7)
E/flutter (31498): #23     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (31498): #24     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

重要的是,该应用程序能够连接到其他 websocket 服务器。它还可以连接到我开发的其他原型(prototype)服务器,以便在同一台机器上进行测试。

.Net core 服务器也非常实用,我可以轻松地将浏览器连接到服务器并与其通信。

仅当我尝试将 flutter 应用程序连接到 .Net core websocket 服务器时,问题才会出现。

我正在使用默认模板应用程序进行测试。这是我的 MyHomePage 类的代码

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final channel = new IOWebSocketChannel.connect("ws://192.168.1.139/client");

这是 _MyHomePageState 实现

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

initState() {
        super.initState();
        widget.channel.stream.listen(this.onData, onError: onError, onDone: onDone);

    (() async {
      setState(() {

      });
    });
  }

  onDone(){
    debugPrint("Socket is closed");
  }

  onError(err){
    debugPrint(err.runtimeType.toString());
    WebSocketChannelException ex = err;
    debugPrint(ex.message);
  }

  onData(event){
    debugPrint(event);
  }

总是会导致 onError 并输出以下内容

I/flutter ( 4608): WebSocketChannelException
I/flutter ( 4608): WebSocketChannelException: WebSocketException: Connection to 'http://18.217.117.92/client#' was not upgraded to websocket
I/flutter ( 4608): Socket is closed

我知道它与 dart websocket 包如何与服务器执行握手有关,但无法查明问题。

任何人都可以弄清楚这里到底出了什么问题吗?

最佳答案

我希望这会对很多人有所帮助,尽管这个问题不再相关。问题出在 .Net core websocket 实现上。

通过一些研究并分析 Wireshark 日志后,我可以意识到 .Net core 期望以特定格式的 websocket 协议(protocol)更新 header (即实现区分大小写),这对于 .Net core Framework 2.1 来说是正确的。不过,这个问题在下一个版本中立即得到了解决。我切换到测试版,问题得到解决。我就此咨询了 Flutter 开发人员以及 .Net core 团队,他们也证实了这一点。

.Net core的当前版本(在回答这个问题时是3.0,没有这样的问题。

关于asp.net-core - flutter websocket连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50227931/

相关文章:

c# - 如何在构建时将我的类库程序集复制到我的 Web 项目?

c# - ASP.Net Core 验证问题状态 - 绑定(bind)验证不返回问题详细信息

javascript - 什么是 NaCl 套接字 API?

dart - 测试 Dart API 包装器

c# - EF核心: The instance of entity type cannot be tracked and context dependency injection

c# - .NET Core 中 Assembly.GetEntryAssembly() 的等价物是什么?

android - 实时 native 移动应用程序使用哪种连接?

go - 由 golang 生成的基于 WebAssembly 的 Websockets?

json - Flutter从互联网上获取数据

dart - 如何使用 built_value 正确反序列化顶级泛型