信号器 - 从javascript客户端代码连接到远程集线器

时间:2017-05-31 15:10:50

标签: javascript asp.net-mvc signalr

我的情况是:

  1. 服务器应用程序A将分配的任务保存到数据库 数据库由更改通知监视,并且有一个服务器中心正在运行。

  2. 与服务器应用程序B一起运行的客户端Javascript代码必须连接到远程集线器。这样,只要App A插入数据库,它就会收到通知。

  3. 这是我的服务器代码

    我下载了owin.cors包。

     [assembly: OwinStartup(typeof(Global))]
     namespace Demo
      {
        public class Global : System.Web.HttpApplication
    {
        public static void Configuration(IAppBuilder app)
        {
    
    
            app.Map("/signalr", map =>
            {
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration
                {
                    EnableDetailedErrors=true,
    
                };
    
                map.RunSignalR(hubConfiguration);
            });
    
        }
    

    notificationHub.cs

    public class NotificationHub : Hub
    {
    
        public static Hashtable UserIdLookupTable = new Hashtable(20);
        public static Dictionary<string,Job> PendingNotificationTable = new 
        Dictionary<string,Job>(20);
    
        public void OnChange(string userId,string task,string description,string 
         duration)
        {
            if (UserIdLookupTable.ContainsKey(userId))
            {
    
        this.Clients.Client(UserIdLookupTable[userId].ToString()).Notify(userId, 
       task);
                UserIdLookupTable.Remove(userId);
                if (PendingNotificationTable.ContainsKey(userId))
                    PendingNotificationTable.Remove(userId);
    
            }
            else
                PendingNotificationTable.Add(userId, new Job(userId, task, 
        description, duration));
    
        }
    
        public override Task OnConnected()
        {
            string name =Context.QueryString["userId"];
            registerConnectionId(name);
    
            return base.OnConnected();
        }
    
        public void registerConnectionId(string userId)
        {
            if (UserIdLookupTable.ContainsKey(userId))
                 UserIdLookupTable[userId] =  Context.ConnectionId;
                else
                      UserIdLookupTable.Add(userId, Context.ConnectionId);
    
            if(PendingNotificationTable.ContainsKey(userId))
            {
                Job j=PendingNotificationTable[userId];
                OnChange(j.UserId, j.Description, j.EmployeeName, j.Duration);
    
            }
    
        }
    

    客户端代码连接到远程集线器

    我的脚本包含

     <script src="~/Scripts/jquery-1.6.4.min.js"></script>
     <script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>
      <script src="~/Scripts/HubConnection.js"></script>
    

    HubConnection.js

    function ConnectToHub()
     {
      jQuery.support.cors = true;
      $.connection.hub.url = "http://myip:56698";
       $.connection.hub.qs = { 'UserId' : '35' };
       var connection = $.hubConnection();
      var hub = connection.createHubProxy('NotificationHub');
      hub.on('Notify', function(userName, message) {
         console.log(userName + ' ' + message);
       });
       connection.logging = true;
       connection.start().done(function () {
            console.log('Now connected, connection ID=' + connection.id);
    
        })
        .fail(function (a)
        {
            console.log('Could not connect'+ a );
        });
        }
    

    使用chrome进行调试时,它会进入connection.start并且不会成功或失败。只需离开脚本。没有迹象表明它已连接到服务器。

    它必须在服务器上点击OnConnected吗?

    想知道我是否错过了什么。

    上面的客户端代码就是我在客户端项目中所做的一切(除了安装signalr.client包之外)。这够了吗?

0 个答案:

没有答案