我有一些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已连接并打开以接收请求,为什么调用时会出错?
我发现您在proxy.On()处理程序内部调用某个东西时出错很奇怪,因为该处理程序将从服务器端执行,因此您已连接。您确定在该确切行而不是其他任何地方收到错误吗?
简短说明:
SignalR不处理断开连接。您需要自己处理
详细说明:
当您的客户端失去连接时,SignalR将尝试重新连接约20秒。状态为reconnecting。这段时间过后,它进入disconnected状态,将不再连接。
要处理这种情况,您必须聆听连接状态的更改,并在状态==断开连接时重新连接自己。我发现这样做时最好创建一个新的集线器连接,否则您可能会遇到各种各样的异常情况和怪异行为。
如果您在断开状态下调用任何方法,您的应用都会崩溃,因此我建议在调用时始终使用try / catch。
通常,一旦重新建立连接,您将希望重新调用失败的呼叫。
我编写了一个类帮助程序来处理所有提到的逻辑。在ios / android设备上经过了很好的测试。