没有在单独的项目中调用ASP.NET MVC SignalR客户端方法

时间:2020-01-18 05:38:10

标签: asp.net-mvc signalr signalr-hub signalr.client

我必须在同一服务器上有两个单独的asp.net项目。据我所知,在两个项目中都安装了所有正确的SignalR nuget软件包。一个是ChatServer,另一个是ChatClient。都是DotNetNuke项目。

第二个项目确实了解signalR,因为在运行客户端项目时,服务器项目中的OnConnected在运行时被触发,并且以在线方式(通过服务器的OnConnected方法)插入了客户端用户。

当服务器联机(通过启动服务器项目)时,客户端“ getonlineusers”中的方法不会被触发。 但是,如果刷新客户端,则服务器确实显示为脱机状态。但我不必刷新。

我可能会丢失一些不确定的东西,如果我为客户项目正确创建代理,将不胜感激。

如何将客户单独的项目连接到具有带SignalR集线器的项目?

在ChatServer项目中:

public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }


public class ChatSupportHub : Hub
    {
        private ChatServerManager CSM { get; set; }

        private int UserID { get; set; }

        //private UserInfo CurrentUser { get; set; }
        public ChatSupportHub()
        {
            CSM = new ChatServerManager();
            //CurrentUser = DotNetNuke.Entities.Users.UserController.Instance.GetCurrentUserInfo();
        }


        public override Task OnConnected()
        {

            int outNumber = -1;

            Online user = new Online();
            User dbUser = new User();

            var userid = Context.QueryString["userid"];

            bool success = Int32.TryParse(userid, out outNumber);

            string connID = Context.ConnectionId;

            if (success)
            {
                user.ID = outNumber;
                dbUser = CSM.GetUser(outNumber);
                UserID = outNumber;
            }

            user.ConnectionID = connID;
            user.Type = dbUser.TypeID.HasValue ? CSM.GetUserType((int) dbUser.TypeID) : null;
            user.ShowOnline = true;

            CSM.AddOnlineUser(user);

            var onlineUsers = CSM.GetOnlineUsers();

            var clients = Clients.Caller;

            string onlineUserJSON = JsonConvert.SerializeObject(onlineUsers);

            clients.getonlineusers(dbUser.Name, onlineUserJSON);

            return base.OnConnected();
        }


        public override Task OnDisconnected(bool stopCalled)
        {
            var username = Context.User.Identity.Name;

            int userID = CSM.GetUserId(username);

            CSM.RemoveOnlineUser(userID);


            return base.OnDisconnected(stopCalled);
        }
    }

以及ChatServer项目的“查看索引”页面:

<script src="~/myServertProjectPath/Scripts/jquery.signalR-2.4.1.min.js"></script>
<script src="~/signalr/hubs"></script>

<script>

    $(function () {

        // set up the hub connection
        var hub = $.connection.chatSupportHub;
        $.connection.hub.qs = "userid=" + @Model.CurrentUserInfo.UserID.ToString();

        hub.client.getonlineusers = function (currentUsername, onlineUsers) {

            if (onlineUsers) {
                console.log('There are users online and one is: ' + currentUsername);
            }
        }

        $.connection.hub      
            .start()          
            .done(function () {

            })
   });

在视图的单独客户端项目中也是如此:

<script src="~/myClientProjectPath/Scripts/jquery.signalR-2.4.1.min.js"></script>
<script src="~/signalr/hubs"></script>

<script>
    $(function () {
        connect();
    });

    function connect() {

        hub = $.connection.chatSupportHub;
        $.connection.hub.qs = "userid=" + @Model.CurrentUserInfo.UserID.ToString();


        hub.client.getonlineusers = function (currentUsername, onlineUsers) {
            if (onlineUsers) {
                console.log ("Hello from the separate project.");
            }
        }

        $.connection.hub
            .start()
            .done(function () {

            })
    }
</script>

0 个答案:

没有答案