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

这两天想着不能这么无私,最近.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集成signalr的更多相关文章

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

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

  2. ASP.NET CORE 2.0 Uses SignalR Technology

    https://www.codeproject.com/Articles/1208322/ASP-NET-CORE-Uses-SignalR-Technology

  3. ASP.NET Core 2.0 SignalR 示例

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

  4. 基于Asp.Net Core 5.0依赖Quartz.Net框架编写的任务调度web管理平台

    源码地址: https://github.com/246850/Calamus.TaskScheduler 演示地址:http://47.101.47.193:1063/ 1.Quartz.NET框架 ...

  5. asp.net core 2.0 webapi集成signalr

    asp.net core 2.0 webapi集成signalr   在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的: 这两天想着不能这么无私,最近.N ...

  6. 升级 ASP.NET Core 3.0 设置 JSON 返回 PascalCase 格式与 SignalR 问题

    由于一些 JS 组件要求 JSON 格式是 PascalCase 格式,新版本 ASP.NET Core 3.0 中默认移除了 Newtonsoft.Json ,使用了微软自己实现的 System.T ...

  7. [翻译] ASP.NET Core 3.0 的新增功能

    ASP.NET Core 3.0 的新增功能 全文翻译自微软官方文档英文版 What's new in ASP.NET Core 3.0 本文重点介绍了 ASP.NET Core 3.0 中最重要的更 ...

  8. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  9. ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介

    概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...

随机推荐

  1. cocos2dx - tmx地图分层移动处理

    接上一节内容:cocos2dx - 节点管理 瓦片地图(Tiled Map) 在cocos2dx文档中有简单的介绍及使用.详情可以看:http://www.cocos2d-x.org/docs/man ...

  2. SELECT与SET对变量赋值

    SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们并没有注意,其实这两 ...

  3. 2017年十大奇葩画风的H5页面案例,原来脑洞可以这样大

    每个人都是视觉动物,画面精美.体验奇特的H5,用户在内心一般都会满分打出,毫不吝啬,同时也毫不犹豫分享,因为此时的分享不掉价儿~ 今天给大家准备了十支H5,画风超级奇特,非常值得一看所有案例均可在19 ...

  4. Maven Install指令构建时出现找不到符号

    检查引用的JRE编译的版本,可能由于JRE编译版本太低导致的  

  5. kafka 的 createDirectStream

    一入大数据深似海,脑袋不够用了,先留下只言片语. kafka api中给出2类直接获取流的接口:createStream和createDirectStream. createStream比较简单,只需 ...

  6. HTTP认证方式与https简介

    HTTP认证与https简介 HTTP请求报头: Authorization [ˌɔ:θəraɪˈzeɪʃn] HTTP响应报头: WWW-Authenticate [ɔ:ˈθentɪkeɪt] HT ...

  7. await和async更多的理解

    最近有不少网友提起await和async,呵呵,C# 5引进的语法糖. 这个语法糖还真不好吃,能绕倒一堆初学的朋友,在网上也有很多网友关于这块知识点的争论,有对有错,今天在这里把这个误区好好讲讲. 在 ...

  8. IntelliJ下断点不可用 No executable code found

    情景说明:ant工程+IntelliJ Idea 采取copy编译后的class文件到WEB-INF/classes目录下,断点一直不可用 如图: 网上查了很多资料都说的不够明确,IntelliJ社区 ...

  9. Vue源码后记-更多options参数(2)

    写起来感觉都是老三套,AST => render => VNode => patch 之前是把AST弄完了,对事件和过滤器处理如图: render函数也只看这两部分的转换吧! 首先是 ...

  10. 读书笔记-你不知道的JS中-promise

    之前的笔记没保存没掉了,好气,重新写! 填坑-- 现在与将来 在单个JS文件中,程序由许多块组成,这些块有的现在执行,有的将来执行,最常见的块单位是函数. 程序中'将来'执行的部分并不一定在'现在'运 ...