不调用SignalR Hub方法

时间:2016-01-14 16:22:37

标签: xamarin signalr

我有一个SignalR中心和两个客户端(适用于Android和iOS的Windows和PCL)。这两个客户端都无法在服务器上调用某些方法。这种行为很奇怪,因为这些方法看起来很相似。此外,我的同事能够调用我无法调用的方法,反之亦然,不会调用我调用的方法而没有问题。

以下是一个方法的示例,它对我有用,对我的同事不起作用:

    public override async Task<bool> RefreshArray(User user, int waitMilis)
    {
        var cts = new CancellationTokenSource();

        try
        {
            cts.CancelAfter(waitMilis);
            await Proxy.Invoke("RefreshArray", user);
            return true;
        }
        catch (Exception ex)
        {
            OnExceptionOccured(ex);
            return false;
        }
    }

这种方法对我不起作用,但适用于我的同事:

    public override async Task<bool> RequestInformation(User user, Product product, int waitMilis)
    {
        var cts = new CancellationTokenSource();

        try
        {
            cts.CancelAfter(waitMilis);
            await Proxy.Invoke("RequestInformation", user, product);
            return true;
        }
        catch (Exception ex)
        {
            OnExceptionOccured(ex);
            return false;
        }
    }

是的,我和我的同事有完全相同的代码。不,没有错别字或不同的论点。我试图通过设置_connection.TraceLevel = TraceLevels.All;尽可能多地从客户端连接获取数据但是,我没有获得有关调用方法的任何信息,只是来自集线器的回复。在致电RefreshArray时,我得到了我要求的数据。调用RequestInformation时,调试器甚至从未在hub方法中命中断点,_connection.Trace仅显示:11:22:45.6169660 - 7bc57897-489b-49a2-8459-3fcdb8fcf974 - SSE: OnMessage(Data: {})

有人解决了类似的问题吗?有解决方案吗?

更新1

我刚刚意识到我在一年前遇到了几乎相同的问题(Possible SignalR bug in Xamarin Android)。 StackOverflow也指出了一个几乎相同问题(SignalR on Xamarin.iOS - randomly not able to call Hub method)的问题,只与iOS和Azure有关。但是,在Windows Phone 8.1和Windows 10 Universal App上,我甚至在Xamarin之外也遇到了同样的问题。此外,我正在本地运行服务器,所以它不是Azure的问题。真的有可能,一个2岁的小虫没有解决方案吗?

更新2

我刚刚使用SignalR.Client创建了一个简单的控制台应用程序。在控制台应用程序中,每种方法都运行良好。令人惊讶的是,Windows 10 Universal Application也开始按预期运行 - 每个集线器方法都被正确调用。 Windows Phone 8.1还改进了其行为(调用了所有集线器方法)。但是,连接尝试定期重新连接(无明显原因),导致Connection started reconnecting before invocation result was received.错误。 Android应用程序仍然像以前一样。

所以我尝试复制我之前的步骤并创建了另一个控制台应用程序,但这次是使用SignalR.Client.Portable库。令我失望的是,Android应用程序行为没有任何变化。

下周我们将开始在iOS上测试我们的应用程序,所以我真的很想知道我们会遇到什么新奇怪的事情。

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题(至少看起来如此)。事实证明,当一个应用程序收到SignalR hub的答案时,会有一些奇怪的东西出现。似乎HubProxy在Android上被阻止了一段时间,同时它断开连接并开始在Windows Phone上定期重新连接,而不是等待来自集线器的asnwer。

在集线器上实现RefreshArray是这样的:

public async Task RefreshArray(User user)
{
    await Clients.Caller.SendArray(_globalArray);
    await Clients.Caller.SendMoreInformation(_additionalInfo);
}

因为该方法发送了两个方法作为答案,客户端代理被卡住了,每个平台都以自己意想不到的方式处理它。我的计算机而不是同事调用某些方法的原因很简单,因为我们有不同的断点位置,这使得应用程序能够至少解决一些请求和响应。

最终的解决方案是在方法的调用中添加一些同步。现在我的集线器只调用await Clients.Caller.SendArray(_globalArray);。然后在客户端上使用ArraySent(string[] array)事件处理此事件,然后在集线器上调用SendMoreInformation()方法。