SignalR 响应服务器请求时“必须调用开始才能发送数据”

问题描述 投票:0回答:4

我有一些 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 已连接并打开以接收请求,为什么它在调用时出错?

c# signalr
4个回答
7
投票

我发现在调用

proxy.On()
处理程序中的某些内容时出现错误真的很奇怪,因为该处理程序将从服务器端执行,因此您已连接。您确定您在该行而不是其他任何地方都收到了错误吗?

简短说明

SignalR 不处理断开连接。你需要自己处理它们

详细说明

当您的客户端失去连接时,SignalR 将尝试重新连接约 20 秒。状态是

reconnecting
。在那段时间之后,它进入
disconnected
状态并且不会再次连接。

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

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

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

我写了一个 class helper 来处理所有提到的逻辑。它在 ios/android 设备上经过了很好的测试。


2
投票

因为错误引用了你的

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

SignalR 连接/集线器指南

希望这有帮助

最好的问候,

乔治


0
投票

可能是调用方法签名与方法不匹配的原因 你打电话的那个

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(对象状态);


0
投票

我遇到了类似的错误。我只是将错误的中心名称传递给

CreateHubProxy
.

© www.soinside.com 2019 - 2024. All rights reserved.