响应服务器请求时,SignalR“必须先调用启动才能发送数据”

Edm*_*g99 2 c# signalr

我有一些SignalR客户端代码,在服务器发出请求后会调用服务器方法:

        var connection = new HubConnection(_hubAddress);
        var hubProxy = _hubConnection.CreateHubProxy(HubName);
        connection.Start().Wait(TimeSpan.FromMinutes(1));
  ...

        hubProxy.On("Client_Method", (string callerId, string requestIdentifier) =>
        {
           if (connection.State == ConnectionState.Connected)
           {
              // error hapening on the invoke call here, despite 
              // the connection state being connected.  
              // Do I need to call Start here?
              hubProxy.Invoke("Proxy_Method_Callback", callerId, requestIdentifier);
           }
        });
Run Code Online (Sandbox Code Playgroud)

但是它抛出一个例外:

InvalidOperationException:无法发送数据,因为连接处于断开状态。发送任何数据之前先呼叫开始。

但是,如果hubProxy已连接并打开以接收请求,为什么调用时会出错?

xle*_*eon 7

我发现您在proxy.On()处理程序内部调用某个东西时出错很奇怪,因为该处理程序将从服务器端执行,因此您已连接。您确定在该确切行而不是其他任何地方收到错误吗?

简短说明

SignalR不处理断开连接。您需要自己处理

详细说明

当您的客户端失去连接时,SignalR将尝试重新连接约20秒。状态为reconnecting。这段时间过后,它进入disconnected状态,将不再连接。

要处理这种情况,您必须聆听连接状态的更改,并在状态==断开连接时重新连接自己。我发现这样做时最好创建一个新的集线器连接,否则您可能会遇到各种各样的异常情况和怪异行为。

如果您在断开状态下调用任何方法,您的应用都会崩溃,因此我建议在调用时始终使用try / catch。

通常,一旦重新建立连接,您将希望重新调用失败的呼叫。

我编写了一个类帮助程序来处理所有提到的逻辑。在ios / android设备上经过了很好的测试。

  • 链接不再有效。 (2认同)