工作上遇到一个推送消息的功能的实现。本着面向百度编程的思想。网上百度了一大堆。主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于Asp.Net SignalR 的demo

这里简单的介绍一下Signalr,SignalR 封装了WebSocket、ForeverFrame、ServerSentEvents、LongPolling四种主要的传输协议。兼容性比较好,WebSocket 是有要求的,IIS服务需要系统是Win8或者 Server 2012 以上。下面开始撸代码。

1.首先建立一个项目。

2.通过包管理工具,引入SignalR

3.引入之后,需要手动添加两个类。

PushHub 集线器类,Singlarl类的主要操作都由这个类实现。

     public class PushHub : Hub
{
/// <summary>
/// 第一次连接
/// </summary>
/// <returns></returns>
public override Task OnConnected()
{
return base.OnConnected();
} /// <summary>
/// 断开连接
/// </summary>
/// <param name="stopCalled"></param>
/// <returns></returns>
public override Task OnDisconnected(bool stopCalled)
{
string user = ConnectManager.GetUserName(Context.ConnectionId);
ConnectManager.RemoveUser(user);
Show(string.Format("{0}退出", user)); return base.OnDisconnected(stopCalled);
} /// <summary>
/// 获取当前的用户标识
/// </summary>
/// <returns></returns>
private string GetUserId()
{
return Context.QueryString["userId"];
} /// <summary>
/// 发送消息
/// </summary>
/// <param name="content"></param>
/// <param name="receiveUser"></param>
public void Show(string content,string receiveUser="")
{
string user = ConnectManager.GetUserName(Context.ConnectionId);
if (string.IsNullOrEmpty(receiveUser))
{
Clients.All.show(content);
}
else {
Clients.Client(ConnectManager.GetUserConnect(receiveUser)).show(string.Format("{0}发消息:{1}",user, content));
} } /// <summary>
/// 登录操作
/// </summary>
/// <param name="user"></param>
public void Login(string user)
{ ConnectManager.OnlineInit(user, Context.ConnectionId);
Show(string.Format("{0}:登录成功", user));
} }

4.Startup类

    public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR(); //声明注册集线器映射
}
}

5.连接管理类

     /// <summary>
/// 连接管理类
/// </summary>
public class ConnectManager
{
/// <summary>
/// 连接记录池
/// </summary>
private readonly static ConcurrentDictionary<string, string> _connectPool = new ConcurrentDictionary<string, string>(); /// <summary>
/// 添加用户
/// </summary>
/// <param name="userKey"></param>
/// <param name="connection"></param>
public static void AddUser(string userKey, string connection)
{
_connectPool[userKey] = connection;
} /// <summary>
/// 删除用户
/// </summary>
/// <param name="userKey"></param>
public static void RemoveUser(string userKey)
{
string connection = null;
_connectPool.TryRemove(userKey, out connection);
} /// <summary>
/// 是否存在连接(是否在线)
/// </summary>
/// <param name="receiverId"></param>
/// <returns></returns>
public static bool IsOnline(string receiverId)
{
return _connectPool.Keys.Contains(receiverId);
} /// <summary>
/// 推送消息给个人
/// </summary>
/// <param name="receiveId"></param>
/// <param name="msg"></param>
public static void PushSingleMessage(string receiveId, string msg)
{
try
{
GetHubContext().Clients.Client(_connectPool[receiveId]).show(msg);
}
catch (Exception ex)
{
var errMsg = ex.Message;
}
} /// <summary>
/// 获取推送上下文
/// </summary>
/// <returns></returns>
public static IHubContext GetHubContext()
{
return GlobalHost.ConnectionManager.GetHubContext<PushHub>();
} /// <summary>
/// 上线初始化
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="connectionId">连接ID</param>
public static void OnlineInit(string userId, string connectionId)
{
AddUser(userId, connectionId);
} public static string GetUserName(string value)
{
return _connectPool.Where(a => a.Value == value).FirstOrDefault().Key;
} public static string GetUserConnect(string userName)
{
return _connectPool[userName];
}
}

6.前台代码

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div>
用户名称:<input type="text" id="user" placeholder="输入用户名" class="input" /><input type="button" id="login" value="登录" class="btn btn-sm btn-info" /><br />
接收人:<input type="text" id="receiveUser" placeholder="接收人(不填默认群发)" class="input" /><br />
<input type="text" id="content" placeholder="发送内容" class="input" /> &nbsp;&nbsp;<input type="button" value="发送" class="btn btn-sm btn-info" id="send" />
<div>
<h4>接收到的信息:</h4>
<ul id="dataContainer"></ul>
</div>
</div>
<script src="Scripts/jquery-3.3.1.min.js"></script>
<script src="Scripts/jquery.signalR-2.4.1.min.js"></script>
<script src="signalr/hubs"></script> ///这个要注意默认就是这样写,不要问为什么。哈哈
<script language="javascript">
$(function () {
var chat = $.connection.pushHub; console.log(chat);
//连接服务端集线器,demoHub为服务端集线器名称,js上首字母须改为小写(系统默认)
//定义客户端方法,此客户端方法必须与服务端集线器中的方法名称、参数均一致。
//实际上是服务端调用了前端的js方法(订阅)
//若多个参数,服务端也需要一致 chat.client.show = function (content) {
var html = '<li>' + htmlEncode(content) + "</li>";
$("#dataContainer").append(html);
} //定义推送
$.connection.hub.start()
.done(function () {
$("#login").click(function () {
chat.server.login($("#user").val()); //将客户端的content内容发送到服务端
$("#user").val("");
});
$("#send").click(function () {
chat.server.show($("#content").val(), $("#receiveUser").val()); //将客户端的content内容发送到服务端
$("#content").val("");
});
}); });
//编码
function htmlEncode(value) {
var encodedValue = $('<div />').text(value).html();
return encodedValue;
}
</script>
</body> </html>

这就是所有的demo的代码

demo代码:https://github.com/chaorending/Demo.SignalR.git

Asp.Net SignalR 使用记录的更多相关文章

  1. Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置

    Asp.Net SignalR 使用记录   工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...

  2. [Asp.net 开发系列之SignalR篇]专题一:Asp.net SignalR快速入门

    一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到SignalR技术,所以打算总结下Asp.net ...

  3. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(六) 之 Layim源码改造右键菜单--好友、组管理功能的实现。

    前言 上一篇中讲解了加好友的流程,本篇将介绍好友管理,群组管理的右键菜单功能.当然由于菜单项目太多,都实现也得花费时间.只讲解一下我是如何从不知道怎么实现右键菜单到会自定义菜单的一个过程.另外呢,针对 ...

  4. 第一章ASP.NET SignalR简介

    第一章ASP.NET SignalR简介 1.1概述: ASP.NET SignalR是微软新开发的类库,为的是帮助ASP.NET开发人员很方便地开发实时网络功能. SignalR允许服务器端和客户端 ...

  5. ASP.NET SignalR 2.0入门指南

    ASP.NET SignalR 2.0入门指南 介绍SignalR ASP.NET SignalR 是一个为 ASP.NET 开发人员的库,简化了将实时 web 功能添加到应用程序的过程.实时Web功 ...

  6. 使用ASP.NET SignalR实现一个简单的聊天室

    前言 距离我写上一篇博客已经又过了一年半载了,时间过得很快,一眨眼,就把人变得沧桑了许多.青春是短暂的,知识是无限的.要用短暂的青春,去学无穷无尽的知识,及时当勉励,岁月不待人.今天写个随笔小结记录一 ...

  7. WinForm中 Asp.Net Signalr消息推送测试实例

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  8. 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式

    连表查询都用Left Join吧   最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...

  9. ASP.NET SignalR入门

    前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM ...

随机推荐

  1. Threads(异步和多线程)

    Task是.NET Framework4.5出现的,线程是基于线程池的,然后提供丰富的api,Thread方法很多很强大,但是太过强大,没有限制. DoSomethingLong方法如下: /// & ...

  2. crm-3权限

    1.权限基本实现 rbac: rbac基于角色的权限控制 ,权限本质就是url 权限表: url列表 角色表: 一个角色固定访问一些url的地址 用户表: 用户可以绑定角色 ,用户拥有了角色的权限 生 ...

  3. Asp.Net Core 开发之旅之.net core 连接数据库

    数据库连接字符串放入配置文件中 打开appsettings.json 添加ConnectionStrings 例子如下: { "Logging": { "IncludeS ...

  4. 在PyCharm中打开文件的位置

    选中文件,右键选择  Show in Explorer (在资源管理器中显示) 只需要路径时,选择第四个Copy Path ,会复制文件的路径

  5. Jinkins自动构建

    Jinkins自动构建 1.项目添加 点击左侧操作栏“新建”,填写项目基础信息,如下图: 2. General配置 2.1 丢弃旧的构建 注:此处勾选丢弃旧的构建,默认天数为1,最大个数建议填写3-5 ...

  6. 如何把转入成功的XXX.sql导入到自己的数据库里

    1.新建自己的mysql连接,mysql连接名随便起,如cxf  密码尽量写123456或者root,防止忘记.按照图示右键(如果想在已有的mysql连接基础上建立数据库连接直接看第二步) 2.右键名 ...

  7. RFM模型的应用 - 电商客户细分(转)

    RFM模型是网点衡量当前用户价值和客户潜在价值的重要工具和手段.RFM是Rencency(最近一次消费),Frequency(消费频率).Monetary(消费金额) 消费指的是客户在店铺消费最近一次 ...

  8. C++ 模板特化、偏特化测试程序

    #include <iostream> // 偏特化的模板不会自己添加构造函数 ctor 和 析构函数 dtor #if 1 // P1 template <typename T1, ...

  9. ubuntu18.40 rtx2080ti安装显卡驱动/cuda/cudnn/tensorflow-gpu

    电脑环境 ubuntu 18.40 gpu  rtx2080ti 一.安装显卡驱动 刚开始尝试用手动安装方式安装驱动 下载了驱动程序但是因为没有gcc所以放弃这种方法 后尝试最简单的方式 在 菜单-- ...

  10. shiro异步请求返回JSON响应

    shiro异步请求返回JSON响应 需求1:当shiro请求资源,但是没有进行认证时,默认是进行重定向,现在需要返回JSON响应.注意异步请求,服务器重定向后,ajax拿到的是浏览器重定向后的到的页面 ...