ASP.NET MVC如何集成SignalR 做聊天的及时通信 asp.net聊天mvcSignalr 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也在用signalr,效果不错,就是偶尔会断。用来在OA系统中做一下推送什么的还行,如果说即时聊天的话,不太保险额。 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); }); }); 救急!!!!关于javascript问题 如何从url字符串里面提取参数?? 求教了。。。 C#怎么让日历控件显示时间? gridview分页显示性能是否较差? 操作word时页面横向显示,应该怎么做? 菜鸟问题:XP下面的IIS不能运行aspx gridview模板列位置问题 手机号的正则表达式 为什么同一套虚拟主机,更简单的功能,ASP.NET程序还是asp程序快很多,而且不至一点点 如何在DATAGRID中单击一行改变其颜色及如何得到单击行的值? mvc二次触发事件 backbone中model.save()提交的值,后台怎么获取啊?
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);
});
});