我有一些 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);
}
});
但是它抛出一个异常:
InvalidOperationException: 无法发送数据,因为连接失败 处于断开连接状态。在发送任何数据之前开始通话。
但是如果 hubProxy 已连接并打开以接收请求,为什么它在调用时出错?
我发现在调用
proxy.On()
处理程序中的某些内容时出现错误真的很奇怪,因为该处理程序将从服务器端执行,因此您已连接。您确定您在该行而不是其他任何地方都收到了错误吗?
简短说明:
SignalR 不处理断开连接。你需要自己处理它们
详细说明:
当您的客户端失去连接时,SignalR 将尝试重新连接约 20 秒。状态是
reconnecting
。在那段时间之后,它进入disconnected
状态并且不会再次连接。
要处理这种情况,您必须监听连接状态变化,并在状态 == 断开时重新连接。我发现这样做时最好创建一个新的集线器连接,否则你可能会遇到各种各样的异常和奇怪的行为。
如果您在断开连接状态下调用任何方法,您的应用程序将崩溃,因此我建议在调用时始终使用 try/catch。
通常,一旦重新建立连接,您会希望重新调用失败的呼叫。
我写了一个 class helper 来处理所有提到的逻辑。它在 ios/android 设备上经过了很好的测试。
因为错误引用了你的
connectionState
似乎与您呼叫的集线器断开连接。在客户端上,您应该首先调用集线器连接的 Start- 函数。
所以你的客户端连接到服务器。 例子:
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>(
"UpdateStockPrice", stock =>
Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price)
);
await hubConnection.Start();
希望这有帮助
最好的问候,
乔治
可能是调用方法签名与方法不匹配的原因 你打电话的那个
hubProxy.Invoke("Proxy_Method_Callback", callerId, requestIdentifier);
HubProxy.Invoke Method (methodname, Object[])
method
Type: System.String
The method to be invoked.
args
类型:System.Object[] 该方法的参数。
_
hub.Invoke("Acknowledge","向 MainHub 打个招呼");
private void Acknowldege(对象状态);
我遇到了类似的错误。我只是将错误的中心名称传递给
CreateHubProxy
.