SignalR在asp.net core下使用

消息即时推送服务,相当于一个微服务,
而客户端的js也可以看成是异步通信的封装,
他可以访问这个微服务定义的集线器hub
一个最简单的配置说明

 

1.初始化

nuget需要安装 Microsoft.AspNetCore.SignalR
当前使用的版本是1.1
在startup文件

 public IServiceProvider ConfigureServices(IServiceCollection services)
 {
services.AddSignalR();
}


public void Configure(IApplicationBuilder app,IHostingEnvironment env,IConferenceService service,IBackgroundJobClient backgroundJobs)
{
app.UseSignalR(routes =>
            {
                routes.MapHub<DialogueHub>("/Hub"); 
 //这个定义的Hub就是虚拟出来的服务地址,我们的具体服务文件也会放这个路径
            });
}

2.js signalr封装
官网的demo可以直接使用,当然,根据自己的业务,要做些调整
建立个mysignalr.js文件

import n from ‘namespace‘;
import * as sg from ‘../../libs/signal/dist/browser/signalr‘;
n.namespace(‘cj.signalR‘);
cj.signalR = sg;

这个是由于我项目版本用了requirejs做管理,所以使用起来有点绕,不过配置好,还是很稳定的
signalr的实例方法就有点变化了


建立个myhub.js文件

import n from ‘namespace‘;
n.namespace(‘cj.hub‘);

cj.hub = {
//构建页面元素
init: function (options) {
var self = this;
this.setting = {};
$.extend(this.setting,options || {});
self.bindEvent();

},
//绑定事件
bindEvent: function () {
var self = this;

var data = JSON.parse($(‘#djson‘).val());

if (typeof vm_dialogue === ‘undefined‘) {
window.vm_dialogue = cj.ko_data(data,‘vm_dialogue‘);
} else {
cj.ko_dataRebind(data,vm_dialogue);
}

console.info(‘dialogue‘,data);

var connection = new cj.signalR.HubConnectionBuilder().withUrl("/Hub").build();
//这个这样实例化,好处当然是全部归一到自己定义的cj命名空间了

//监听这个ReceiveMessage方法,这个是后台设置的第一个参数,这里对应名字就好
//至于第二个参数后,有多个重载,现在支持10个object,
//例子暂时返回一个item对象
connection.on("ReceiveMessage",(item) => {
//var msg = item.Context.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");

var userid = $(‘#huserid‘).val();
var dias = cj.tojs(vm_dialogue);
var dia = { Id: item.id,Context: item.context,Name: item.name,logo: item.logo };
if (item.id === $(‘#huserid‘).val()) {
dia.IsOwner = true;
dia.IsVisable = false;
//判断是否当前用户发送
}
else {
dia.IsOwner = false;
dia.IsVisable = true;
}

dias.Items.push(dia);
cj.ko_dataRebind(dias,vm_dialogue);
if (typeof $(‘.ps--active-y‘)[0] !== ‘undefined‘) {
$(‘.ps--active-y‘).scrollTop($(‘.ps--active-y‘)[0].scrollHeight);
}

});
//这里加载必须打开,然后这里的通讯才生效
connection.start().then(function () {
//document.getElementById("sendButton").disabled = false;
}).catch(function (err) {
return console.error(err.toString());
});

$(‘#msg_send‘).click(function (event) {
var userid = $(‘#huserid‘).val();
var message = $(‘#type_msg‘).val();
//这里可看出异步ajax,把对应的内容发送到hub里面
connection.invoke("SendMessageById",userid,message).catch(function (err) {
return console.error(err.toString());
});
event.preventDefault();
});

}
};

看下hub集线器的写法

 public class DialogueHub : Microsoft.AspNetCore.SignalR.Hub
{
   /// <summary>
        /// 根据用户ID发送消息
        /// </summary>
        /// <param name="userid"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public async Task SendMessageById(string userid,string message)
        {
//具体service通过DI注入得到,
            var user = _service.UserBackById(Guid.Parse(userid));
            DialogueItem item = new DialogueItem();
            item.Context = message;
            item.Id = userid;
            item.Name = user.Name;
            item.logo = user.logo;
            await Clients.All.SendAsync("ReceiveMessage",item);
 //这个对应js的on方法,这个方法支持10个obj参数

        }

 protected ICacheService _Cache;
        protected ILogger<DialogueHub> _logger;
        protected IConferenceService _service;
        public DialogueHub(ICacheService cache,ILogger<DialogueHub> logger,IConferenceService service
            )
        {
            _Cache = cache;
            _logger = logger;
            _service = service;
        }

}

这样,整个signalR就配置好,可以使用了。
其他一些深入点的使用,只列举一下
Microsoft.AspNetCore.SignalR.Hub<IT>有个泛型接口方法,实现后可以替换
SendAsync。
Clients除了All发送所有,还有个 Clients.User,可以指定对应用户等等

来个截图看下效果

分享图片

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包括:CLS、...
基于 .NET 的一个全新的、好用的 PHP SDK + Runtime: PeachPie 来啦!
.NET 异步工作原理介绍。
引子 .NET 6 开始初步引入 PGO。PGO 即 Profile Guided Optimization,通过收集运行时信息来指导 JIT 如何优化代码,相比以前没有 PGO 时可以做更多以前难以
前言 2021/4/8 .NET 6 Preview 3 发布,这个版本的改进大多来自于底层,一起来看看都有什么新特性和改进吧。 库改进 新增值类型作为字典值时更快的处理方法 .NET 6 Previ
前言 开头防杠:.NET 的基础库、语言、运行时团队从来都是相互独立各自更新的,.NET 6 在基础库、运行时上同样做了非常多的改进,不过本文仅仅介绍语言部分。 距离上次介绍 C# 10 的特性已经有
直接使用 CIL - .NET 上的汇编语言编写 .NET Standard 类库
前言 不知不觉中,.NET Framework 已经更新到 4.8,.NET Core 也更新到了 3.0 版本。那么 .NET 的未来怎么样呢? 计划 2019 年 Build 大会上,微软宣布下一
本文带你穿越到未来一起看看未来的 C# 到底长什么样子。
前言 TypedocConverter 是我先前因帮助维护 monaco-editor-uwp 但苦于 monaco editor 的 API 实在太多,手写 C# 的类型绑定十分不划算而发起的一个项
前言 在 2021 年 3 月 11 日, .NET 6 Preview 2 发布,这次的改进主要涉及到 MAUI、新的基础库和运行时、JIT 改进。 .NET 6 正式版将会在 2021 年 11
前言 命名空间已经在 .NET 中使用了多年,一直追溯到 .NET Framework 1.1。它在 .NET 实施本身的数百个位置中使用,并且直接被成千上万个应用程序使用。在所有这些方面,它也是 C
.NET 上的统一跨平台 UI 框架来啦
使用 F# 手写一个 Typedoc 转 C# 代码生成器,方便一切 C# 项目对 TypeScript 项目的封装。
LINQ + SelectMany = Monad!
C# 10 主要特性一览
C# 的编译期反射终于来啦!
前言 2021 年 2 月 17 日微软发布了 .NET 6 的 Preview 1 版本,那么来看看都有什么新特性和改进吧,由于内容太多了因此只介绍一些较为重点的项目。ASP.NET Core 6
前言 有一个东西叫做鸭子类型,所谓鸭子类型就是,只要一个东西表现得像鸭子那么就能推出这玩意就是鸭子。 C 里面其实也暗藏了很多类似鸭子类型的东西,但是很多开发者并不知道,因此也就没法好好利用这些东西,
经过五年半的持续维护,Senparc.Weixin SDK 逐步丰满和完善,在升级的过程中,我们为基础库(Senparc.Weixin.dll)加入了许多通用的功能,例如加密/解密算法、通用缓存方法等