客户端的回调不会从signalR后端触发

时间:2018-12-22 23:48:52

标签: javascript c# asp.net signalr signalr.client

服务器端无法与客户端通信时遇到麻烦。从客户端发送数据后,我就会在后端接收数据,但是,反之亦然(将数据发送回客户端时),反之亦然。

我的项目设置:

  • 使用框架4.6.2创建一个空的ASP.NET应用程序

  • 已安装nuget软件包'Microsoft.AspNet.SignalR'v2.4.0

  • 使用jQuery 3.3.1

  • 添加了启动类并插入了“ app.MapSignalR();”进入 配置方法

  • 添加了一种集线器,该集线器具有一种与来回通信的方法。 客户

  • 添加了一个js文件,用于启动集线器并与 服务器

我尝试了以下操作,但未成功:

  • 使用框架4.5
  • 使用旧版jQuery
  • 登录数据 后端(我确实从客户端接收数据的
  • 试图将邮件发送回所有与呼叫者相对的客户端(Clients.All)
  • 重新创建一个新的 signalR项目
  • 确保没有JS错误
  • 在多种浏览器(Chrome和Edge)中本地运行

index.aspx:

<script src="/js/third_party/jquery-3.3.1.min.js"></script>
<script src="/js/third_party/jquery-ui.min.js"></script>

<script src="/js/third_party/jquery.signalR-2.4.0.min.js"></script>
<script src='/signalr/js'></script>
<script src="/js/client.js"></script>

client.js:

var conn = null;

$(function () {

    $.connection.hub.stateChanged(connectionStateChanged);
    $.connection.hub.start({ waitForPageLoad: false });
    conn = $.connection.login;

    function connectionStateChanged(state) {

        switch (state.newState) {
            case 1: // Connected
                conn.server.announce('This is an announcement.'); // Works fine and sends the message
                break;
        }

    }

    // I'm using '.client', so there is no reason why this should not be triggered
    conn.client.onAnnounce = function (message) {
        alert(message); // Does NOT receive the message back
        debugger;
    }

Login.cs:

public class Login : Hub
{
    public void Announce(string message)
    {
        // I receive the data here from the client... but it does not get sent back to the client
        Clients.Caller.onAnnounce(message);
    }
}

Startup.cs:

[assembly: OwinStartup(typeof(AutoPlayer.Startup))]
namespace SignalRTest
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

我希望服务器收到一条消息,服务器将同一条消息发送回客户端,并让客户端提醒该消息。

1 个答案:

答案 0 :(得分:1)

经过数小时的尝试不同的尝试,这是由于以下代码行造成的:

$.connection.hub.start({ **waitForPageLoad: false** });

删除“ waitForPageLoad”设置,或将其设置为true即可解决。

waitForPageLoad-确定SignalR是否应等待页面完全加载以开始连接(默认为true)。

我认为这是由于服务器调用回客户端时客户端JS文件没有完全加载('conn.client.onAnnounce'还不存在)。想通了,如果确实是这样,我会在控制台中看到JS错误...但我想不是。