在响应服务器请求时,SignalR“必须在发送数据之前调用Start”

时间:2016-06-29 03:46:36

标签: 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);
           }
        });

但它抛出异常:

  

InvalidOperationException:由于连接无法发送数据   处于断开状态。在发送任何数据之前调用start。

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

4 个答案:

答案 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();

SignalR Connection/Hubs-Guide

希望这有帮助

致以最诚挚的问候,

格奥尔格

答案 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