C# 在客户机方法内调用signalR方法

C# 在客户机方法内调用signalR方法,c#,signalr,console-application,signalr-hub,signalr.client,C#,Signalr,Console Application,Signalr Hub,Signalr.client,我使用的是signalR版本2.1.2。我使用控制台应用程序作为信号客户端。我调用了一个方法-a,在得到响应后,我必须根据方法-a的响应调用方法-B。在这种情况下,我能够成功地调用方法-B,但没有从方法-B得到任何响应。我的错误是什么??。这是我的密码 var hubConnection = new HubConnection("Url"); IHubProxy proxy = hubConnection.CreateHubProxy("HitProxy"); proxy.On<bool

我使用的是signalR版本2.1.2。我使用控制台应用程序作为信号客户端。我调用了一个方法-a,在得到响应后,我必须根据方法-a的响应调用方法-B。在这种情况下,我能够成功地调用方法-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();
var-hubConnection=新的hubConnection(“Url”);
IHubProxy=hubConnection.CreateHubProxy(“HitProxy”);
proxy.On(“Client-method-B”,(retvAl)=>
{
Console.WriteLine(“方法B响应”);
});
proxy.On(“Client-method-A”,(已连接)=>
{
Console.WriteLine(“方法A响应”);
如果(未连接)
{
Invoke(“method-B”,“someValue”).Wait();
}
});
hubConnection.Start().Wait();
Invoke(“方法-A”,“123”).Wait();

在这里,我没有从“方法B”得到任何回应。谢谢。

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

IHubProxy proxy = hubConnection.CreateHubProxy("HitProxy");
但后来你用

hubProxy.Invoke("method-B", "someValue").Wait();
那么它只是一个类型和proxy==hubProxy吗

我建议你做三件事

  • 在调用方法B时,使用wireshark检查是否有任何到服务器的实际流量
  • 检查服务器端是否正确调用了该操作
  • 您可能希望尝试调度操作B,使其不会在回调上下文中调用-根据您的应用程序,您可能希望使用Dispatcher或仅使用Task.Run。我不确定signarclient,但有些框架不喜欢在回调中调用它们的方法

  • 从signarserver方法获取结果的最佳方法是读取其返回值,而不是在调用方调用客户机方法。例如,您可以从方法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在服务器端返回字符串值。

    Hi Lukasz我编辑了我的问题。我只是尝试使用Dispatch事件绕过当前线程。确实,我注意到一件事:在回调中使用proxy.Invoke(“method-B”,“someValue”).Wait();所以您正在阻塞signar可能用于向服务器发送消息的线程。不确定“我只是试图使用Dispatch事件绕过当前线程”是什么意思?尝试使用任务。运行以启动确定吗?比如Task.Run(()=>proxy.Invoke(“method-B”,“someValue”).Wait();我正在“Client-method-A”中使用这个.Dispatcher.Invoke(()=>Testmethod())。在这个方法“Testmethod”中,我将调用“method-B”,并且“Client-method-B”将立即调用。这个方法正确吗?那要看情况。我相信,您在代码中看到的主要问题是在signarclient用于执行调用的线程上下文中调用.Wait()。使用Dispatch.Invoke可能会有所帮助,但请记住,使用静态Invoke调用将使用当前线程调度程序,因此不确定在您的情况下它会是什么(例如,对于控制台应用程序,没有创建默认调度程序)。您应该发布中心代码,这里可能有问题。谢谢@XmindZ,它工作得很好………),还有一点您应该调用wait()方法来接收结果。。。即>proxy.Invoke(“method-B”,“someValue”).ContinueWith((u)=>{Console.WriteLine(“method-B响应:+u.Result”);}.wait();那么只有我们能够从调用方法中接收结果——