SignalR使集线器外的客户端无法工作

SignalR Get Clients outside of Hub not working

本文关键字:工作 客户端 集线器 SignalR      更新时间:2023-09-26

我正试图从控制器调用signalR,但它不起作用。

控制器

public ActionResult Index(){
   var hub = GlobalHost.ConnectionManager.GetHubContext<ClientControl>();
   hub.Clients.All.sendMessage("ahahhaaa");
   //... return and staff
}

集线器

[Authorize]
[HubName("userTracking")]
public class ClientControl : Hub
{
    public void RegisterConnection(String controller, String action)
    {
    }
    public override Task OnConnected()
    {
    }
    public override Task OnDisconnected()
    {
        return base.OnDisconnected();
    }
}

前端

$(document).ready(function () {
    var trackhub = $.connection.userTracking;
    trackhub.client.sendMessage = function (msg) {
        alert(msg);
    }
    $.connection.hub.logging = true;
    $.connection.hub.start();
});

在控制器中,它不会抛出错误。当我调试并暂停它时,hub对象存在,但当我执行它时,它不会向前端发送消息。如果我从hub调用相同的方法,那么它就是一个魅力。你知道问题的根本原因是什么吗?如果需要-写在评论中,我会提供更多信息。

服务器

public class ChatHub : Hub
{
        public int TryAddNewUser(string userName)
        {
            //some logic...
            Clients.All.AddUserToUserList(id, userName);
            return id;
        }
        public void AddNewMessageToPage(int id, string message)
        {
            //some logic...
            Clients.All.addNewMessageToPage(u.Login, message);
        }
}

客户端

$(document).ready(function () {
    //first need register client methods
    var chat = $.connection.chatHub;
    chat.client.addUserToUserList = function (id, login) {
        //client logic for add new user
    }
    chat.client.addNewMessageToPage = function (login, message) {
        //client logic for add new message from user
    }
    //second need start chat
    $.connection.hub.start().done(function () {
        chat.server.tryAddNewUser(login).done(function (id) {
            alert("Added " + id)
        });
    });
});

控制器

public class ChatController : Controller
{
   private IMyDataService _service;
   public ChatController(IMyDataService s)
   {
      _service = s;
   }
   public ActionResult Index()
   {
      return View(new MyDataViewModel(_service));
   }
}

注意,动态js文件必须使用相同的路径添加

<script type="text/javascript" src="~/signalr/hubs"></script>

我将以下代码添加到Startup.cs

using Owin;
using Microsoft.Owin;
    [assembly: OwinStartup(typeof(ChatRoom.Startup))]
    namespace ChatRoom
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                // Any connection or hub wire up and configuration should go here
                app.MapSignalR();
            }
        }
    }

关于此,请参阅链接

请将控制器中的集线器名称更改为工作

使用

var hub = GlobalHost.ConnectionManager.GetHubContext<UserTracking>();
       hub.Clients.All.sendMessage("ahahhaaa");

代替

var hub = GlobalHost.ConnectionManager.GetHubContext<ClientControl>();
       hub.Clients.All.sendMessage("ahahhaaa");

请注意GetHubContext<>中集线器类名的更改

希望这能有所帮助。