我有一些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:由于连接无法发送数据 处于断开状态。在发送任何数据之前调用start。
但是如果hubProxy已连接并打开以接收请求,为什么它在调用时出错?
答案 0 :(得分:5)
我发现在proxy.On()
处理程序中调用某些内容时出错,我觉得很奇怪,因为该处理程序将从服务器端执行,因此您已连接。你确定你在那个确切的行而不是其他地方得到错误吗?
简短说明:
SignalR不处理断开连接。你需要自己处理它们
长解释:
当您的客户端失去连接时,SignalR将尝试重新连接约20秒。州是reconnecting
。在此期间之后,它会进入disconnected
状态并且不会再次连接。
要处理这种情况,您必须侦听连接状态更改,并在state == disconnected时重新连接。我发现在执行此操作时创建新的集线器连接会更好,否则您可能会遇到各种异常和奇怪的行为。
如果您在断开连接状态下调用任何方法,您的应用程序将崩溃,因此我建议在调用时始终使用try / catch。
通常,一旦重新建立连接,您将需要重新调用失败的呼叫。
我写了一个class helper来处理所有提到的逻辑。它在ios / android设备上经过了很好的测试。
答案 1 :(得分:1)
由于错误引用你的
connectionState
似乎与您呼叫的集线器断开连接。在客户端上,您应首先调用集线器连接的启动功能。
因此您的客户端连接到服务器。 例如:
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();
希望这有帮助
致以最诚挚的问候,
格奥尔格
答案 2 :(得分:0)
可能是因为Invoking Method签名与方法不匹配的原因 你正在打电话的那个
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(&#34; Acknowledge&#34;,&#34;向MainHub问好&#34;);
private void Acknowldege(对象状态);
答案 3 :(得分:0)
我遇到了类似的错误。我只是将错误的hubname传递给CreateHubProxy
。