asp.net core 2.0 webapi集成signalr(实例讲解)
 更新时间:2017年11月26日 09:05:08   作者:Mr.落叶  

下面小编就为大家分享一篇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” ></ul>

@section scripts {
<script>
$(function () {

let hubUrl = ‘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(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持华域联盟。

您可能感兴趣的文章:如何在Asp.Net Core中集成ABP Dapper如何在Asp.Net Core中集成Refitasp.net core集成CKEditor实现图片上传功能的示例代码asp.net core 使用 TestServer 来做集成测试的方法在ASP.NET Core Mvc集成MarkDown的方法asp.net core集成JWT的步骤记录Asp.Net Core利用xUnit进行主机级别的网络集成测试详解asp.net core集成MongoDB的完整步骤ASP.NET Core与NLog集成的完整步骤ASP.NET Core+Docker+Jenkins实现持续集成的完整实例asp.net core集成kindeditor实现图片上传功能ASP.NET Core 集成 React SPA应用的步骤

asp.net
core
2.0
webapi
集成
signalr

相关文章
asp.net(c#) MS AJAX的安装asp.net(c#) MS AJAX的安装… 2007-06-06
.net core 1.0 实现单点登录负载多服务器这篇文章主要介绍了.net core 1.0 实现单点登录负载多服务器的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友可以参考下 2016-07-07
ASP.Net MVC+Data Table实现分页+排序功能的方法这篇文章主要介绍了ASP.Net MVC+Data Table实现分页+排序功能的方法,结合实例形式分析了asp.net基于mvc架构实现的数据查询、排序、分页显示等相关操作技巧,需要的朋友可以参考下 2017-06-06
Asp.net SignalR支持的平台有哪些Asp.net SignalR支持的平台有哪些,这篇文章主要介绍了Asp.net SignalR支持的平台,需要的朋友可以参考下 2016-04-04
使用VSCode开发和调试.NET Core程序的方法这篇文章主要介绍了使用VSCode开发和调试.NET Core程序的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2020-05-05
ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据这篇文章主要介绍了ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据,需要的朋友可以参考下 2017-06-06
asp.net下创建、查询、修改带名称空间的 XML 文件的例子asp.net下创建、查询、修改带名称空间的 XML 文件的例子… 2007-04-04
使用重绘项美化WinForm的控件这篇文章主要为大家详细介绍了如何使用重绘项美化WinForm中控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2017-10-10
asp.net动态载入用户控件的方法asp.net动态载入用户控件的方法… 2007-09-09
.NET 操作 PostgreSQL遇到的问题这篇文章主要介绍了.NET 操作 PostgreSQL遇到的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 2021-01-01

最新评论

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。