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 = '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(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • .NET 6中为record类型自定义Equals方法

    .NET 6中为record类型自定义Equals方法

    这篇文章主要介绍了.NET 6中为record类型自定义Equals方法,record类型,这是一种新引用类型,而不是类或结构。record与类不同,区别在于record类型使用基于值的相等性,下文小编将介绍更多详细资料,需要的朋友可以参考一下
    2022-03-03
  • .NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)

    .NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)

    这篇文章主要介绍了.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • asp.net使用Repeater控件中的全选进行批量操作实例

    asp.net使用Repeater控件中的全选进行批量操作实例

    这篇文章主要介绍了asp.net使用Repeater控件中的全选进行批量操作方法,实例分析了Repeater控件的使用技巧,需要的朋友可以参考下
    2015-01-01
  • dotnet封装的kindeditor编辑器控件

    dotnet封装的kindeditor编辑器控件

    KindEditor很不错,没有ForNet的扩展,我是搞.net开发的,就用它简单封装了一个控件,拖过来即可使用,使用更加简单
    2014-01-01
  • .NET Core获取配置文件内容

    .NET Core获取配置文件内容

    这篇文章介绍了.NET Core获取配置文件内容的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • ASP.NET中使用Ajax的方法

    ASP.NET中使用Ajax的方法

    之前在Ajax初步理解中介绍了对Ajax的初步理解,本文将介绍在ASP.NET中如何方便使用Ajax,第一种当然是使用jQuery的ajax,功能强大而且操作简单方便,第二种是使用.NET封装好的ScriptManager
    2013-10-10
  • asp.net中Fine Uploader文件上传组件使用介绍

    asp.net中Fine Uploader文件上传组件使用介绍

    最近在处理后台数据时需要实现文件上传.考虑到对浏览器适配上采用Fine Uploader. Fine Uploader 采用ajax方式实现对文件上传.同时在浏览器中直接支持文件拖拽[对浏览器版本有要求类似IE版本必须是9或是更高的IE10].
    2013-01-01
  • asp.net Bundle功能扩展

    asp.net Bundle功能扩展

    发现这个东西确实非常实用,且功能强大,BundleTable.Bundles能够压缩合并js和CSS,但是目前的使用起来不是特别好需要修改BundleConfig的代码
    2012-11-11
  • ASP.NET MVC使用Boostrap实现产品展示、查询、排序、分页

    ASP.NET MVC使用Boostrap实现产品展示、查询、排序、分页

    这篇文章介绍了ASP.NET MVC使用Boostrap实现产品展示、查询、排序、分页的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • ASP.NET Core中MVC模式实现路由二

    ASP.NET Core中MVC模式实现路由二

    这篇文章介绍了ASP.NET Core中MVC模式实现路由的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论