解决方案 »

  1.   

    我也在用signalr,效果不错,就是偶尔会断。用来在OA系统中做一下推送什么的还行,如果说即时聊天的话,不太保险额。
      

  2.   


    public class SignalRHub : Hub
        {
            public static class UserHandler
            {
                public static Dictionary<string, string> ConnectedIds = new Dictionary<string, string>();        }        public override Task OnDisconnected()
            {
                UserHandler.ConnectedIds.Remove(Context.ConnectionId);
                return base.OnDisconnected();
            }        public void stopConnect(string username, IHubContext hub)
            {
                if (!string.IsNullOrWhiteSpace(username))
                {
                    if (UserHandler.ConnectedIds.Where(n => n.Value == username).Any())
                    {
                        var connectedid = UserHandler.ConnectedIds.Where(n => n.Value == username).FirstOrDefault().Key;
                        if (!string.IsNullOrEmpty(connectedid))
                        {
                            hub.Clients.Client(connectedid).stopClient();
                        }
                    }
                }
            }        /// <summary>
            /// 信息推送
            /// </summary>
            /// <param name="hub"></param>
            /// <param name="usernames">接收者,字符串,以“,”相隔</param>
            /// <param name="msgId">消息主表ID</param>
            /// <param name="message">推送信息,当不为空时,会以消息弹框的形式显示信息</param>
            /// <param name="pid">消息对应的业务表的主键id</param>
            /// <param name="viewAction">消息对应的业务表的查看页面action</param>
            /// <param name="menu">消息对应的菜单实体</param>
            /// <param name="count">计数量,用于移动端桌面模块未处理数据的计数</param>        
            /// <param name="moudleId">要刷新的桌面模块的ID</param>
            /// <param name="callBackUrl">回调url,以“/控制器/action”的格式的字符串</param>
            public void sendMessage(IHubContext hub, string usernames, long msgid, string message, int pid, string viewAction, SysMenu menu, int count, int moudleId, string callBackUrl)
            {
                List<string> usernameList = ComLib.LibList.StringToListString(usernames);
                var connectedids = new List<string>();
                foreach (var username in usernameList)
                {
                    if (!string.IsNullOrWhiteSpace(username) && UserHandler.ConnectedIds.Any(n => n.Value == username))
                    {
                        var connectedid = UserHandler.ConnectedIds.Where(n => n.Value == username).FirstOrDefault().Key;
                        if (!string.IsNullOrWhiteSpace(connectedid))
                        {
                            connectedids.Add(connectedid);
                        }
                    }
                }
                hub.Clients.Clients(connectedids).getMessage(msgid, message, pid, menu.ControllerName, viewAction, menu.ID, count, moudleId, callBackUrl);
            }
        }
    我只写了这么个类,然后就是视图中获取了。<script type="text/javascript" src="~/Scripts/jquery-plugins/signalR/jquery.signalR-2.1.0.min.js"></script>
    <script type="text/javascript" src="~/signalr/hubs"></script>var username = "@ViewBag.UserName";
        $(function () {
            $.connection.hub.logging = true;
            var chat = $.connection.signalRHub;
            var hub = $.connection.hub;        ///登录提醒
            chat.client.sayHello = function (message) {
                $("#welcomeInfo").append(message);
            }
            chat.client.getMessage = function (msgId, message, pid, controllerName, actionName, menuId, menuCount, reloadDeskMoudleId, callBackUrl) {
                window.mainpage.dealSignalRHubInfo(username, msgId, message, pid, controllerName, actionName, menuId, menuCount, reloadDeskMoudleId, callBackUrl);
                }
            chat.client.stopClient = function () {
                chat.connection.stop();
            }
            $.connection.hub.start().done(function () {
                chat.server.userConnected(username);
            });
        });