在客户端方法内调用signalR方法

时间:2014-11-26 09:26:20

标签: c# signalr console-application signalr-hub signalr.client

我使用的是signalR 2.1.2版。我正在使用控制台应用程序作为SignalrClient。我调用了一个方法-A,在得到响应之后,我必须根据方法-A的响应来调用方法-B。在这种情况下,我能够成功调用并且没有从方法B获得任何响应。我的错是什么?这是我的代码

var hubConnection = new HubConnection("Url");

IHubProxy proxy = hubConnection.CreateHubProxy("HitProxy");
proxy.On<bool>("Client-method-B", (retvAl) =>
{
    Console.WriteLine("Method-B response");
});

proxy.On<bool>("Client-method-A", (isConnected) =>
{
    Console.WriteLine("Method-A response");
    if(isConnected)
    {
        proxy.Invoke("method-B", "someValue").Wait();
    }
});

hubConnection.Start().Wait();
proxy.Invoke("method-A", "123").Wait();

在这里,我没有得到&#39;方法-B&#39;的任何回复。感谢。

2 个答案:

答案 0 :(得分:3)

从SignalR服务器方法获取结果的最佳方法是读取其返回值,而不是在调用方调用客户端方法。例如,您可以按如下方式读取方法-A的响应:

proxy.Invoke("method-A", "123").ContinueWith((t) =>
{
  bool isConnected = t.Result;
});

期待方法-A的签名类似于:

public bool method-A(string p);

这样,您不必仅调用客户端方法将服务器方法的结果返回给调用者。您可以从另一个服务器方法调用的回调中调用另一个服务器方法,如下所示:

proxy.Invoke("method-A", "123").ContinueWith((t) =>
{
  bool isConnected = t.Result;
  if(isConnected)
  {
    proxy.Invoke("method-B", "someValue").ContinueWith((u) =>
    {
      Console.WriteLine("Method-B response: " + u.Result);
    });
  }
});

假设方法-B在服务器端返回一个字符串值。

答案 1 :(得分:2)

在提供的代码中,您可以创建代理

IHubProxy proxy = hubConnection.CreateHubProxy("HitProxy");

但稍后你使用

hubProxy.Invoke("method-B", "someValue").Wait();

所以它只是一个类型和代理== hubProxy?

我建议你做3件事

  1. 在调用方法B时,使用wireshark检查服务器是否有实际流量
  2. 检查服务器端是否服务器正确调用了操作
  3. 您可能想尝试调度操作B,因此它不会在回调上下文中调用 - 根据您的应用程序,您可能希望使用Dispatcher或仅使用Task.Run。我不确定signalr客户端,但是当你在回调中调用它们的方法时,有些框架不喜欢。