web框架版本:.NET 6
不需要安装nuget有关signalr的包

微软参考文档:
https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-6.0&tabs=visual-studio

Startup.cs配置

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;namespace WebMvcNetCore.TuShi.FenGong
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){try{services.AddSignalR();services.AddMvcCore();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");}app.UseStaticFiles();app.UseRouting();   app.UseAuthorization();app.UseStaticFiles();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Main}/{id?}");endpoints.MapHub<Models.ChatHub>("/chatHub");});}}
}

web项目中配置集线器类

namespace WebMvcNetCore.TuShi.FenGong.Models
{/// <summary>/// 消息推送集线器/// </summary>public class ChatHub : Microsoft.AspNetCore.SignalR.Hub{//public void Revice() {//    Clients.All.SendAsync("ReceiveMessage", user, message);//}}
}

添加SignalR的前端js文件

*.cshtml页面代码

<div class="table-fun" id="workHandMsg" style="color:#FF33FF;margin-right:300px;font-weight:bold;">                </div>
<script src="~/lib/microsoft/signalr/dist/browser/signalr.min.js"></script>
<script type="text/javascript">//后台推送到页面消息var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();connection.start().then(function () {console.log('signalR连接成功');}).catch(function (err) {return console.error(err.toString());});connection.on("ReceiveMessage", function (message) {//console.log(message);console.log('后台消息:'+message);$("#workHandMsg").html(message);});
</script>

在业务层需要推送的地方代码参考,这里用了委托
WorkerController.cs

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MvcSimplePager;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebMvcNetCore.TuShi.FenGong.IBusiness;
using WebMvcNetCore.TuShi.FenGong.Model;
using WebMvcNetCore.TuShi.FenGong.Models;namespace WebMvcNetCore.TuShi.FenGong.Controllers
{/// <summary>/// 工人管理/// </summary>public class WorkerController : BaseController{readonly IWorkBusiness workBusiness;readonly IDepartmentBusiness departmentBusiness;public WorkerController(IWorkBusiness _workBusiness, IDepartmentBusiness _departmentBusiness){workBusiness = _workBusiness;departmentBusiness = _departmentBusiness;}//批量导入工人   创建时间:2021-12-9 17:43:03public async Task<IActionResult> ImportWorker(IFormFile file){//推送工人处理进度消息到前端页面var _contextHub = (Microsoft.AspNetCore.SignalR.IHubContext<ChatHub>)HttpContext.RequestServices.GetService(typeof(Microsoft.AspNetCore.SignalR.IHubContext<ChatHub>));Action<string> action = async (msg) =>{object[] arr = { msg };await _contextHub.Clients.All.SendCoreAsync("ReceiveMessage", arr);};var result = await workBusiness.ImportWorker(file.OpenReadStream(), GetWebLoginUser.Sys_manager_id, action);return Json(result);}}
}

IWorkBusiness.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WebMvcNetCore.TuShi.FenGong.Model;namespace WebMvcNetCore.TuShi.FenGong.IBusiness
{/// <summary>/// 工人业务处理/// </summary>public interface IWorkBusiness{/// <summary>/// 批量导入工人/// </summary>/// <param name="stream">excel文件流</param>/// <param name="loginUserId">登录人id</param>/// <param name="func">推送消息回调</param>/// <returns></returns>/// <remarks>/// 创建时间:2021-12-9 17:42:08/// </remarks>Task<Result> ImportWorker(System.IO.Stream stream, string loginUserId,Action<string> func);}
}

IWorkBusiness.cs实现类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using WebMvcNetCore.TuShi.FenGong.IBusiness;
using WebMvcNetCore.TuShi.FenGong.IDAL;
using WebMvcNetCore.TuShi.FenGong.Model;
using WebMvcNetCore.TuShi.FenGong.Model.Tool;namespace WebMvcNetCore.TuShi.FenGong.BusinessImpl
{/// <summary>/// 获取工人,接口实现/// </summary>public class WorkBusinessImpl : IWorkBusiness{readonly IWorkerDAL workerDAL;readonly IDepartmentBusiness departmentBusiness;readonly IProject_selected_workerDAL project_Selected_WorkerDAL;readonly IOperate_logDAL operate_LogDAL;readonly IDepartmentDAL departmentDAL;public WorkBusinessImpl(IWorkerDAL _workerDAL, IProject_selected_workerDAL _project_Selected_WorkerDAL, IOperate_logDAL _operate_LogDAL, IDepartmentDAL _departmentDAL, IDepartmentBusiness _departmentBusiness){departmentDAL = _departmentDAL;workerDAL = _workerDAL;departmentBusiness = _departmentBusiness;project_Selected_WorkerDAL = _project_Selected_WorkerDAL;operate_LogDAL = _operate_LogDAL;}/// <summary>/// 批量导入工人/// </summary>/// <param name="stream">excel文件流</param>/// <param name="loginUserId">登录人id</param>/// <param name="func">推送消息回调</param>/// <returns></returns>public async Task<Result> ImportWorker(System.IO.Stream stream, string loginUserId, Action<string> func){if (string.IsNullOrWhiteSpace(loginUserId)){return new Result("loginUserId不可为空");}List<Worker> list = new List<Worker>();try{Aspose.Cells.Workbook wb = new Aspose.Cells.Workbook(stream);Aspose.Cells.Worksheet sheet = wb.Worksheets[0];Aspose.Cells.Cells cells = sheet.Cells;if (cells.Rows.Count == 1){return new Result("导入数据至少一行");}func("获取到记录数"+ (cells.Rows.Count-1));for (int i = 1; i < cells.Rows.Count; i++){func($"检查第{i+1}行记录数据...");var row_cells = cells.Rows[i];Worker worker = new Worker();worker.Person_id = Guid.NewGuid().ToString("n");worker.Createtime = DateTime.Now;//姓名var xing_ming_cell = row_cells.GetCellOrNull(0);if (xing_ming_cell == null){return new Result("姓名不可为空,行号" + i);}worker.Real_name = xing_ming_cell.StringValue;if (string.IsNullOrWhiteSpace(worker.Real_name)){return new Result("姓名不可为空");}//性别worker.Gender = false;var xb_cell = row_cells.GetCellOrNull(1);if (xb_cell != null){if (xb_cell.StringValue == "男"){worker.Gender = true;}else{worker.Gender = false;}}//身份证号var idcard_cell = row_cells.GetCellOrNull(2);if (idcard_cell == null){return new Result("身份证号不可为空,行号" + i);}worker.Id_card = idcard_cell.StringValue;if (string.IsNullOrWhiteSpace(worker.Id_card)){return new Result("身份证号不可为空");}if (worker.Id_card.Length > 40){return new Result("身份证号长度超限");}//手机号var ph_cell = row_cells.GetCellOrNull(3);if (ph_cell != null){worker.Phone = ph_cell.StringValue;}//民族var eb_cell = row_cells.GetCellOrNull(4);if (eb_cell != null){worker.Ethnic = eb_cell.StringValue;List<string> minzu = MyConfigReader.GetConfigList("minzu");if (minzu != null && minzu.Count > 0){bool right2 = minzu.Any(x => x == worker.Ethnic);if (!right2){return new Result("民族数据不是有效值");}}}//工区/部门var gh_cell = row_cells.GetCellOrNull(5);if (gh_cell == null){return new Result("工区/部门不可为空,行号:" + i);}worker.Department_id = gh_cell.StringValue.Trim();if (string.IsNullOrWhiteSpace(worker.Department_id)){return new Result("工区/部门不可为空");}//检查部门id是否存在数据库,添加时间:2021-12-16 11:50:08bool right= departmentDAL.Any(x=>x.Id == worker.Department_id);if (!right){return new Result("工区/部门值无效,无效值:"+ worker.Department_id);}//关联号var work_no_cell = row_cells.GetCellOrNull(6);if (work_no_cell == null){return new Result("关联号不可为空,行号:" + i);}worker.Work_no = work_no_cell.StringValue;bool rightNo = await workerDAL.AnyAsync(x => x.Work_no == worker.Work_no);if (rightNo){return new Result($"关联号{worker.Work_no}已存在,请修改,保证唯一");}//职务var zw_cell = row_cells.GetCellOrNull(7);if (zw_cell != null){worker.Position = zw_cell.StringValue;}//职名var zwm_cell = row_cells.GetCellOrNull(8);if (zwm_cell != null){worker.Job = zwm_cell.StringValue;}//技能等级var jndj_cell = row_cells.GetCellOrNull(9);if (jndj_cell != null){worker.Skill_level = jndj_cell.StringValue;}//备注var bz_cell = row_cells.GetCellOrNull(10);if (bz_cell != null){worker.Remark = bz_cell.StringValue;}list.Add(worker);func($"第{i+1}行数据验证通过");}func("数据全部正确,准备保存...");}catch (Exception ex){var ep = ex.InnerException ?? ex;return new Result("读取EXCEL文件异常:" + ep.Message);}finally{stream?.Close();stream?.Dispose();}func("保存处理中...");int count = await workerDAL.AddListAsync(list);if (count > 0){func("保存成功");//记录操作日志                Operate_log operate_Log = new Operate_log();operate_Log.Operate_user_id = loginUserId;operate_Log.Operate_type = 5;operate_Log.Operate_content = "批量导入工人";//operate_Log.Old_data_id = projectId;operate_LogDAL.AddOperateLog(operate_Log);return new Result(true) { Data = list };}return new Result("导入工人失败");}}
}

ASP.NET Core SignalR实时推送配置,业务层实时推送SignalR消息相关推荐

  1. ASP.NET Core应用程序的参数配置及使用

    应用程序的开发不仅仅是写代码这点事情.假设你正在开发一个能够支持多次部署的微服务,此时你就需要有一个合理的应用程序配置方案,以便在开发和生产环境中能够方便地选用不同的配置参数,并且能够在部署到容器服务 ...

  2. ASP.NET Core(十)Configuration 配置优先级详解

    ASP.NET Core 项目启动,默认执行顺序为:宿主 Host -> 读取配置 -> 日志设置 -> 注册服务(DI)-> 添加中间件 -> WebHost 监听 - ...

  3. 如何在 ASP.NET Core 中为同一接口配置不同的实现

    前言 通常,我们使用依赖注入时,一个接口仅对应一种实现,使用时可以直接得到实现类的实例,类似这样: services.AddScoped<IServiceA,ServiceA>();pub ...

  4. Android混合推送,MUI框架-推送配置核心代码-个推推送

    document.addEventListener("plusready", function() { // 获取本地应用资源版本号 plus.runtime.getPropert ...

  5. Asp.Net Core 2.1 取消HTTPS配置

    1.创建Core Web项目时,默认勾选了HTTPS,如下所示 2.右键项目-属性-调试,如下所示 3.如果不去掉会出现如下一种情况 比如:本地运行起来的是https://localhost:5000 ...

  6. ASP.NET CORE WebAPI 中 Route 属性配置

    1 访问路径属性  Route public class OrdersController : ApiController {[Route("customers/{customerId}/o ...

  7. ASP.NET Core环境Web Audio API+SingalR+微软语音服务实现web实时语音识别

    处于项目需要,我研究了一下web端的语音识别实现.目前市场上语音服务已经非常成熟了,国内的科大讯飞或是国外的微软在这块都可以提供足够优质的服务,对于我们工程应用来说只需要花钱调用接口就行了,难点在于整 ...

  8. php asp.net core,asp.net core实例教程之配置

    Asp.Net Core-配置Asp.Net Core-配置 在这一章,我们将讨论 ASP.NET Core项目的相关的配置.在解决方案资源管理器中,您将看到 Startup.cs 文件.如果你有以前 ...

  9. 小米华为苹果推送相关Nginx转发推送配置

    小米华为苹果推送相关Nginx转发推送配置## 标题 1.1推送类型及涉及的推送url 目前涉及到的推送类型包括: 1).APNS苹果推送 2).华为厂商推送 3).小米厂商推送 4).魅族厂商推送 ...

最新文章

  1. asp.net断点续传技术
  2. PAT 1074 Reversing Linked List
  3. 哈佛揪出「熬夜猝死」元凶:问题不在大脑在肠道 | Cell
  4. Latex博士论文格式版本(在CASthesis基础上作修改)
  5. Python 类函数迭代器
  6. 杭电oj2043密码
  7. 认识Skeleton Screen【屏幕加载骨架】
  8. 【读书笔记】.NET本质论第四章-Programming with Type(Part Two)
  9. __nonnull((1)) 未完待续
  10. 转AndroidThings技术资料
  11. mqtt 变为乱码 接受16进制字节流_常见乱码问题分析和总结
  12. sqlite3_get_table()
  13. PHP 图片无损压缩
  14. HQChart实战教程17 -K线沙盘推演
  15. easyui实例案例介绍
  16. 流失用户召回方法策略,教你如何挽回流失用户
  17. 计算机二级该怎么学,计算机二级自学要多久 怎样复习
  18. RMM Level -- 对于REST的层级划分模型
  19. 【ES源码分析】强制合并分段(_forcemerge API)源码分析
  20. 路程c语言,一道关于路程的程序。我一直看不懂,请教大家帮着看看和解释一下,谢谢。我很急急着...

热门文章

  1. braintree_Laravel和Braintree,坐在树上……
  2. 电动汽车模型的各模块的Simulink模型,包括驾驶员模块,整车控制器模块,电机模块,变速器模块
  3. spympy poly模块
  4. post请求爬取艺龙酒店的评论
  5. HDU - 5468 Puzzled Elena (容斥/莫比乌斯)
  6. 黑盒测试,白盒测试,灰盒测试
  7. nfa状态转换图正规式_穿过隔离栅供电:隔离式直流/ 直流偏置电源探讨
  8. 2018全国大学生数学建模竞赛时间及试题下载
  9. 数据科学家面试问答集锦(109个常见问题和回答)
  10. 智慧餐车机器人系统数据流图