【问题标题】:SignalR client-side error: Connection started reconnecting before invocation result was receivedSignalR 客户端错误:在收到调用结果之前连接开始重新连接
【发布时间】:2019-01-11 04:40:06
【问题描述】:

我将使用完整的 asp.net SignalR 2.3.0.0 客户端和服务器,而不是 .net 核心信号器版本作为问题的开头。

javascript 客户端代码

 var pxyHub = $.connection.myHub; 

 $.connection.hub.start();

 pxyHub.server.myServerSideMethod(val1, val2)
    .done( (rntVal) => {
        //do stuff on success...
        })
    .fail( (err) => {
        //do stuff on error...
        })

在服务器端,我在 myServerSideMethod(); 中放置了一个断点; 如果我花时间通过这个服务器端代码,浏览器中的失败回调将触发,err=“在收到调用结果之前连接开始重新连接”

第一季度。 如何延长客户端超时时间,让 JS 调用在失败前等待更长的时间(或无限期),有可能吗?

第二季度。一旦连接断开,我的理解是无论服务器端方法在做什么都可能继续正常......但是 客户不会知道这件事..通常如何解决这种情况? (即通知客户端服务器端方法结果?)

【问题讨论】:

    标签: signalr signalr.client signalr-2


    【解决方案1】:

    这就是我所做的... JS 客户端:

    return myHubProxy.server.getUsers();
    

    在我的 Hub 中,我有:

    public async Task GetUsers()
    {
        try{
             //do stuff to get list of users from database
           }
        catch(Exception ex)
        {
    
        }
        await Clients.All.usersonline((new JavaScriptSerializer()).Serialize(userlist));
    }
    

    您可以在“catch”中添加对 JS 客户端函数的调用,以在失败时调用并通知结果。类似于:await Clients.Caller.errorMessage("There was an error processing your request."); 注意 - 我在这里使用 Clients.Caller,因为我假设您只想将错误返回给请求者。您的结果也一样,有一个调用方法可以返回给调用者。

    【讨论】:

    • 感谢您的回答,但并没有真正回答我关于超时问题的问题。正如我所指出的,错误来自客户端并且连接断开。如果客户端/服务器或服务器/客户端之间没有连接,则服务器无法按照您的指示向客户端广播消息。客户端将需要重新建立一个新连接.. 并且该方法很可能已经完成/或该方法无权访问新连接。
    • 我所说的方法通常可以避免超时,我已经将它用于短期和长期运行的任务而没有遇到错误。鉴于许多原因可能会发生断开连接,您仍然可以按照我的方法,然后存储您的结果以在客户端重新连接时提供给客户端,如果它们在完成后未连接。
    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 2014-04-18
    • 2017-05-26
    • 1970-01-01
    • 2016-04-29
    • 2021-12-05
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多