asp.net core 2.0 webapi集成signalr

 

在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的;

这两天想着不能这么无私,最近.NET CORE貌似挺流行的,闲来无事也自己搞了个asp.net core signalr

博客园里面也有人在.net core 2.0下面集成了signalr,但是是集成在同一个项目里面的,但是大家都知道我们很多的项目都是分离的;

而且signalr涉及到连接数和内存资源的占用问题,如果都集成在一个项目里面当访问量多大的时候容易造成网站访问缓慢,具体原因就不多说了

所以我这里做了一个在.net core webapi里面集成signalr,我们就可以通过调用webapi来实现服务器向客户端推送消息

第一步引用nuget:Mrcrosoft.AspNetCore.SignalR

第二步添加配置代码:

首先ConfigureServices里面添加如下代码:

public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
services.AddCors(options =>
{
options.AddPolicy("SignalrCore",
policy => policy.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod());
});
services.AddSingleton<IServiceProvider, ServiceProvider>();
}

然后Configure里面添加

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//跨域支持
app.UseCors("SignalrCore");
app.UseSignalR(routes =>
{
routes.MapHub<SignalrHubs>("signalrHubs");
});
app.UseWebSockets(); app.UseMvc();
}

然后我们添加一个hubs

public class SignalrHubs:Hub
{
/// <summary>
/// 创建signalr链接
/// </summary>
/// <param name="parentId">pid(作为用户组)</param>
/// <param name="shopId">sid</param>
public Task InitUser(string parentId, string shopId)
{
Groups.AddAsync(Context.ConnectionId, parentId);
SignalrGroups.UserGroups.Add(new SignalrGroups()
{
ConnectionId = Context.ConnectionId,
GroupName = parentId,
ShopId = shopId
});
return Clients.All.InvokeAsync("NoticeOnline", "用户组数据更新完成,新增id为:" + Context.ConnectionId + " pid:" + parentId + " sid:" + shopId + "");
} public override Task OnDisconnectedAsync(Exception exception)
{
//掉线移除用户
var user = SignalrGroups.UserGroups.FirstOrDefault(c => c.ConnectionId == Context.ConnectionId);
if (user != null)
{
SignalrGroups.UserGroups.Remove(user);
Groups.RemoveAsync(Context.ConnectionId, user.GroupName);
}
return base.OnDisconnectedAsync(exception);
}
}

PS:我这里是根据本人业务需要来做的,大家可以修改成其他的(用户量大的时候内存占用肯定高,这里只做一个简单的例子)

以上基本的环境搭建就已经完成了

接下来控制器里面的代码

[Produces("application/json")]
[Route("api/MRSoftPush")]
public class MRSoftPushController : Controller
{
private IHubContext<SignalrHubs> hubContext;
public MRSoftPushController(IServiceProvider service)
{
hubContext = service.GetService<IHubContext<SignalrHubs>>();
} [HttpGet]
public string Get()
{
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff");
} /// <summary>
/// 单个connectionid推送
/// </summary>
/// <param name="groups"></param>
/// <returns></returns>
[HttpPost,Route("AnyOne")]
public IActionResult AnyOne([FromBody]IEnumerable<SignalrGroups> groups)
{
if (groups != null && groups.Any())
{
var ids = groups.Select(c=>c.ShopId);
var list = SignalrGroups.UserGroups.Where(c=>ids.Contains(c.ShopId));
foreach (var item in list)
hubContext.Clients.Client(item.ConnectionId).InvokeAsync("AnyOne", $"{item.ConnectionId}: {item.Content}");
}
return Ok();
} /// <summary>
/// 全部推送
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
[HttpGet,Route("EveryOne")]
public IActionResult EveryOne(string message)
{
hubContext.Clients.All.InvokeAsync("EveryOne", $"{message}");
return Ok();
} /// <summary>
/// 组推送
/// </summary>
/// <param name="group"></param>
/// <returns></returns>
[HttpPost,Route("AnyGroups")]
public IActionResult AnyGroups([FromBody]SignalrGroups group)
{
if (group != null)
{
hubContext.Clients.Group(group.GroupName).InvokeAsync("AnyGroups", $"{group.Content}");
}
return Ok();
} /// <summary>
/// 多参数接收方式
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
[HttpGet,Route("MoreParamsRequest")]
public IActionResult MoreParamsRequest(string message)
{
hubContext.Clients.All.InvokeAsync("MoreParamsRequest", message, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
return Ok();
}
}

服务器端的代码到这里全部完成,接下来咱们看客户端的代码

我的客户端代码是在另外一个项目里面,和服务器端是分离的

<input type="text" id="ParentId" placeholder="ParentId" />
<br />
<input type="text" id="ShopId" placeholder="ShopId" />
<br />
<button id="fuckyou">用户上线</button>
<br />
<br />
<br /> <ul id="message" style="color:red;"></ul> @section scripts {
<script>
$(function () { let hubUrl = 'http://192.168.0.149:8009/signalrHubs';
let httpConnection = new signalR.HttpConnection(hubUrl);
let hubConnection = new signalR.HubConnection(httpConnection);
$("#fuckyou").click(function () {
hubConnection.invoke('InitUser', $("#ParentId").val(), $("#ShopId").val());
});
hubConnection.on('NoticeOnline', data => {
$("#message").append("<li>" + data + "</li>");
});
hubConnection.on('EveryOne', data => {
$("#message").append("<li style=\"color:red;\">全部推送:" + data + "</li>");
});
hubConnection.on('AnyGroups', data => {
$("#message").append("<li style=\"color:black;\">单个用户组推送:" + data + "</li>");
});
hubConnection.on('AnyOne', data => {
$("#message").append("<li style=\"color:blue;\">单个ID推送:" + data + "</li>");
});
hubConnection.on('MoreParamsRequest', (message, date) => {
$("#message").append("<li style=\"color:green;\">多参数接收:" + message + " : " + data + "</li>");
});
hubConnection.start(); });
</script>
}

页面上引用连个js

<script src="/js/signalr-client.min.js"></script>
<script src="/js/jquery.min.js"></script>

到这里基本就已经完成了,下面看一下运行效果

第一次写博客,有点紧张,代码写得比较仓促,很多细节都没有优化,有很多不足之处,望各位多多指正

asp.net core 2.0 webapi集成signalr的更多相关文章

  1. ASP.NET Core 3.0 WebApi中使用Swagger生成API文档简介

    参考地址,官网:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-swashbuckle?view ...

  2. ASP.NET Core 3.0 WebApi 系列【1】创建ASP.NET Core WebApi 项目

    目录 写在前面 一.运行环境 二.项目搭建 三.测试 API 四.基础知识 五.写在最后 写在前面 C#语言可以创建RESTful服务,被称作WebApi.在这里总结学习使用支持创建.读取.更新.删除 ...

  3. ASP.NET Core 3.0 WebApi 系列【2】.Net Core 3.0+ CodeFirst + MySql 实现数据的迁移

    写在前面 在前一小节中,我们创建了基于RESFULL风格的服务.这个小节,尝试使用CodeFirst+MySql 的方式实现数据迁移. 一.开发环境 [1]运行环境:win10 家庭版 [2]开发工具 ...

  4. asp.net core 系列之webapi集成EFCore的简单操作教程

    因为官网asp.net core webapi教程部分,给出的是使用内存中的数据即 UseInMemoryDatabase 的方式, 这里记录一下,使用SQL Server数据库的方式即 UseSql ...

  5. asp.net core 系列之webapi集成Dapper的简单操作教程

    Dapper也是是一种ORM框架 这里记录下,使用ASP.NET 集成 Dapper 的过程,方便自己查看 至于Dapper的特性以及操作可以参考Dapper官方文档 1.创建数据库相关 在Sql S ...

  6. ASP.NET Core 2.0 SignalR 示例

    # 一.前言 上次讲SignalR还是在<[在ASP.NET Core下使用SignalR技术](http://dotnet.ren/2017/02/21/%E5%9C%A8ASP-NET-Co ...

  7. 在ASP.NET CORE 2.0使用SignalR技术

    一.前言 上次讲SignalR还是在<在ASP.NET Core下使用SignalR技术>文章中提到,ASP.NET Core 1.x.x 版本发布中并没有包含SignalR技术和开发计划 ...

  8. ASP.NET Core 1.0 中使用 Swagger 生成文档

    github:https://github.com/domaindrivendev/Ahoy 之前文章有介绍在ASP.NET WebAPI 中使用Swagger生成文档,ASP.NET Core 1. ...

  9. 推荐:【视频教程】ASP.NET Core 3.0 入门

    墙裂推荐了,免费,通俗易懂,唯一可惜的就是不是我录的,更可惜的是人家录制完了快半年了我还没看完... 版权归原作者所有,建议新手还是边看边实践吧,要不然过完一遍发现自己啥也没学会,不要眼高手低 [视频 ...

随机推荐

  1. SharePoint 2016: 数据库正在兼容性范围内运行,建议进行升级

    问题描述: SharePoint 运行状况分析器提示: 中文:数据库正在兼容性范围内运行,建议进行升级. 英文:Database running in compatibility range and ...

  2. <TCP/IP>ICMP报文的分类

    Internet控制报文协议,即为ICMP(Internet Control Message Protocal),用于主机,路由器之间传递信息,其目的是让我们能够检测网路的连线状况﹐也能确保连线的准确 ...

  3. 删除元素splice、shift\pop

      splice() 方法: 向/从数组中添加/删除项目,然后返回被删除的项目. splice( index位数, 数量, 新添加 ) 该方法会改变原始数组 删除数组中第一个元素 arr.shift( ...

  4. 【原创】大数据基础之Hive(5)性能调优Performance Tuning

    1 compress & mr hive默认的execution engine是mr hive> set hive.execution.engine;hive.execution.eng ...

  5. test pictures

    https://cnbj1.fds.api.xiaomi.com/mace/demo/mace_android_demo.apk

  6. jquery 获取和设置 select下拉框的值

    获取Select : 获取select 选中的 text : $("#ddlRegType").find("option:selected").text(); ...

  7. 第十七单元 Samba服务

    Samba的功能 Samba的安装 Samba服务的启动.停止.重启 Samba服务的配置 Samba服务的主配置文件 samba服务器配置实例 Samba客户端设置 windows客户端 Linux ...

  8. C# Parallel并发执行相关问题

    1.Parallel并发执行 using System;using System.Collections.Generic;using System.Linq;using System.Text;usi ...

  9. Metasploit 使用后门和Rootkit维持访问

    1.内存攻击指的是攻击者利用软件的漏洞,构造恶意的输入导致软件在处理输入数据时出现非预期的错误,将输入数据写入内存中的某些敏感位置,从而劫持软件控制流,转而执行外部的指令代码,造成目标系统获取远程控制 ...

  10. Java基本语法(一)

    一.标识符 (1)标识符就是在编写程序时给类,变量,方法等起的名字 (2)标识符的命名规则:标识符由字母,数字,下划线和$组成;第一个字符不能是数字;不能与关键字重名 二.关键字 定义:也称保留字,是 ...