SignalR指定用户推送

2024-06-10 09:58
文章标签 指定 用户 推送 signalr

本文主要是介绍SignalR指定用户推送,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

添加SignalR推送官方文档:
https://docs.microsoft.com/zh-cn/aspnet/core/signalr/groups?view=aspnetcore-5.0

项目安装Microsoft.AspNetCore.SignalR包

配置集线器类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SignalR;namespace WebNetCore5_Img_Storage.Handler
{//继承IUserIdProvider用于告诉SignalR连接用谁来绑定用户idpublic class GetUserId : IUserIdProvider{string IUserIdProvider.GetUserId(HubConnectionContext connection){//获取当前登录用户idstring userid = connection.GetHttpContext().Session.GetString("user_id");return userid;}}public class ChatHub : Hub{public async Task SendMessage(string user, string message){await Clients.All.SendAsync("ReceiveMessage", user, message);}//特定用户推送消息public async Task SendPrivateMessage(string user, string message){await Clients.User(user).SendAsync("ReceiveMessage", message);}}
}

C#推送代码

 public class FileUploadController : BaseController{private readonly IHubContext<ChatHub> hubContext;public FileUploadController(IHubContext<ChatHub> _hubContext){        hubContext = _hubContext;}public async Task<ActionResult> UploadBigFile(IFormFile file)
{//当前登录用户idstring loginUserId=Current.Id;//后台上传进度decimal process = Math.Round((decimal)fileNo * 100 / total_minio_file_count, 2);	 //推送消息到前端hubContext.Clients.User(loginUserId).SendAsync("ReceiveMessage", loginUserId, process);								
}

配置启动类注册IUserIdProvider的实例

   // This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){//解决中文输出后被编码了services.Configure<Microsoft.Extensions.WebEncoders.WebEncoderOptions>(options =>{options.TextEncoderSettings = new System.Text.Encodings.Web.TextEncoderSettings(System.Text.Unicode.UnicodeRanges.All);});//services.AddControllersWithViews();//添加全局筛选器:services.AddControllersWithViews(options =>{options.Filters.Add(typeof(CustomExceptionFilter));})//自定义格式化json使用Newtonsoft.Json.AddNewtonsoftJson();//services.addNewservices.AddRazorPages();//session配置缓存组件依赖,分布式缓存//services.AddDistributedMemoryCache();//会话存活时间,单位(秒)int sessionTime = 0;int.TryParse(MyConfigReader.GetConfigValue("session_live_time"), out sessionTime);if (sessionTime == 0){sessionTime = 7200;}services.AddSession(options =>{//设置cookie名称//options.Cookie.Name = ".AspNetCore.Session";//会话滑动过期时间,距下次访问最小时间,超过则session失效options.IdleTimeout = TimeSpan.FromSeconds(sessionTime);options.Cookie.HttpOnly = true;options.Cookie.IsEssential = true;});//业务层注入  //services.AddScoped<IImgBLL, ImgBLLImpl>();string path = AppDomain.CurrentDomain.BaseDirectory;Assembly bll_impl = Assembly.LoadFrom(path + "WebNetCore5_Img_Storage.BLL.dll");Assembly bll_interface = Assembly.LoadFrom(path + "WebNetCore5_Img_Storage.IBLL.dll");var typesInterface = bll_interface.GetTypes();var typesImpl = bll_impl.GetTypes();foreach (var item in typesInterface){var name = item.Name.Substring(1);string implBLLImpName = name + "Impl";var impl = typesImpl.FirstOrDefault(w => w.Name.Equals(implBLLImpName));if (impl != null){//services.AddTransient(item, impl);//services.AddSingleton(item, impl);services.AddScoped(item, impl);}}//数据层注册Assembly dalAssemblys = Assembly.LoadFrom(path + "WebNetCore5_Img_Storage.DAL.dll");Assembly dalInterface = Assembly.LoadFrom(path + "WebNetCore5_Img_Storage.IDAL.dll");var dalTypesImpl = dalAssemblys.GetTypes();var dalTypesInterface = dalInterface.GetTypes();foreach (var item in dalTypesInterface){var name = item.Name.Substring(1);string implDalName = name + "Impl";var impl = dalTypesImpl.FirstOrDefault(w => w.Name.Equals(implDalName));if (impl != null){//services.AddTransient(item, impl);services.AddScoped(item, impl);}}services.AddMvcCore();//用户IUserIdProvider实例注册services.AddScoped<Microsoft.AspNetCore.SignalR.IUserIdProvider, GetUserId>();//SignalR添加到服务services.AddSignalR();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Error");}app.UseHttpsRedirection();app.UseStaticFiles(new StaticFileOptions(){//不限制content-type下载ServeUnknownFileTypes = true,配置的虚拟路径映射//RequestPath = "/local",物理地址//FileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider("D:\\Work\\西南油气田图库系统\\WebNetCore5_Img_Storage\\WebNetCore5_Img_Storage\\bin\\Debug\\net5.0"),});app.UseRouting();//app.UseAuthentication();app.UseAuthorization();app.UseSession();//app.UseResponseCaching();//app.UseResponseCompression();//用MVC模式, 针对services的services.AddControllersWithViews();app.UseEndpoints(endpoints =>{//endpoints.MapDefaultControllerRoute();endpoints.MapRazorPages();endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");endpoints.MapHub<ChatHub>("/chathub");});

前端界面js代码

    <script src="~/lib/microsoft/signalr/dist/browser/signalr.min.js"></script>//signalR推送消息,用于显示后台实时处理进度var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();connection.on("ReceiveMessage", function (user, message) {console.log("user=" + user + ",message=" + message);//后台上传视频到文件系统进度值$("#back_process_value").html(message+"%");});connection.start().then(function () {console.log("signalR推送连接成功");}).catch(function (err) {console.error("signalR推送连接异常");return console.error(err.toString());});//document.getElementById("sendButton").addEventListener("click", function (event) {//    var user = document.getElementById("userInput").value;//    var message = document.getElementById("messageInput").value;//    connection.invoke("SendMessage", user, message).catch(function (err) {//        return console.error(err.toString());//    });//    event.preventDefault();//});

这篇关于SignalR指定用户推送的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047847

相关文章

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

struts2中的json返回指定的多个参数

要返回指定的多个参数,就必须在struts.xml中的配置如下: <action name="goodsType_*" class="goodsTypeAction" method="{1}"> <!-- 查询商品类别信息==分页 --> <result type="json" name="goodsType_findPgae"> <!--在这一行进行指定,其中lis是一个List集合,但

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

家庭和学生用户笔记本电脑配置方案

2.6.1  家庭和学生用户笔记本电脑配置方案   2.6.1  家庭和学生用户笔记本电脑配置方案   普通家庭用户、学生用户主要用于上网、娱乐、学习等,这类用户要求笔记本电脑的各方面 功能比较均衡。在选购此类笔记本电脑时,主要考虑外观设计方面要比较时尚,而且性能上也要 够强,一些大型复杂的软件以及目前的主流游戏都要能够流畅地运行才行。   对于CPU方面,可以考虑目前主流的第二

[轻笔记] ubuntu Shell脚本实现监视指定进程的运行状态,并能在程序崩溃后重启动该程序

根据网上博客实现,发现只能监测进程离线,然后对其进行重启;然而,脚本无法打印程序正常状态的信息。自己通过不断修改测试,发现问题主要在重启程序的命令上(需要让重启的程序在后台运行,不然会影响监视脚本进程,使其无法正常工作)。具体程序如下: #!/bin/bashwhile [ 1 ] ; dosleep 3if [ $(ps -ef|grep exe_name|grep -v grep|

[轻笔记] jupyter notebook 指定conda虚拟环境

安装插件 conda install nb_conda 进入conda env conda activate ${env_name}conda install ipykernelconda deactivate #3. 运行jupyter notebook conda activate # 需要先进入conda环境,非常重要jupyter notebook 会发现,在ju