【SignalR全套系列】之在.Net Core 中实现Server-Send Events消息推送

微信公众号:趣编程ACE
关注可了解更多的.NET日常开发技巧,如需源码 请公众号留言 源码;
如果觉得本公众号对你有帮助,欢迎关注

【SignalR全套系列】之在.Net Core 中实现Server-Send Events消息推送

1.前文链接:

【SignalR全套系列】之在.NetCore中实现WebSocket双工通信

2.简介:

严格来说,HTTP协议无法做到服务器主动推送消息,有一种变通方法就是,服务器告知客户端我接下里要发送的是流信息,而SSE(Server-Send Events)就是基于这个原理来实现通信的。

SSE与WebSocket作用类似,都是作用于服务端与客户端之间通信的,但是Websocket 是全双工通信,而SSE只能是单工通信(服务器向浏览器发送)

具体讲解可参考下面文章:
https://www.ruanyifeng.com/blog/2017/05/server-sent_events.html

3.基于.Net Core 实现SSE

首先建立一个客户端页面程序:

1<!DOCTYPE html>2<html>3<head>4    <meta charset="utf-8" />5    <title></title>6</head>7<body>8    <script>9        var source = new EventSource("/see");  //SSE API对象
10        // onmessage 是用来接受消息的通用回调函数
11        source.onmessage = (event) => console.log('接收服务端消息', event.data);
12        // onopen 当服务端与客户端建立链接后 就会触发open 事件
13        source.onopen = () => console.log("开始链接");
14        // 通信失败 就会触发 error事件  这时候回调onerror函数
15        source.onerror = (event) => console.log(event);
16
17        // 自定义事件 可以自定义需要执行的message事件  这时候通用的message事件就不会被触发了
18        source.addEventListener('custom', (e) => console.log('custom', e.data));
19    </script>
20</body>
21</html>
服务端应用程序:
1public class Startup2    {34        private readonly Channel<string> _channel; // 通道变量5        public Startup(IConfiguration configuration)6        {7            Configuration = configuration;8            _channel = Channel.CreateUnbounded<string>(); // 创建一个无消息上限的通道9        }
10
11        public IConfiguration Configuration { get; }
12
13        // This method gets called by the runtime. Use this method to add services to the container.
14        public void ConfigureServices(IServiceCollection services)
15        {
16            services.AddControllers();
17        }
18
19        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
20        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
21        {
22            if (env.IsDevelopment())
23            {
24                app.UseDeveloperExceptionPage();
25            }
26
27            // 开启静态文件
28            app.UseStaticFiles();
29
30            app.UseRouting();
31
32            app.UseAuthorization();
33
34            app.UseEndpoints(endpoints =>
35            {
36                endpoints.MapControllers();
37                // 捕获路由  /send?m=xxxxx
38                endpoints.Map("/send", async ctx =>
39                {
40                    if (ctx.Request.Query.TryGetValue("m", out var m))
41                    {
42                        // 控制台输出
43                        Trace.WriteLine("开始发送 :" + m);
44                        //  写入到通道中去
45                        await _channel.Writer.WriteAsync(m);
46                    }
47                    // 响应返回
48                    ctx.Response.StatusCode = 200;  
49                });
50            });
51
52            // 自定义一个中间件
53            app.Use(async (ctx, next) =>
54            {
55                // 发送 /see 路由  建立链接
56                if(ctx.Request.Path.ToString().Equals("/see"))
57                {
58                    var response = ctx.Response;
59                    // 以流的形式 返回给客户端 
60                    response.Headers.Add("Content-Type", "text/event-stream");
61
62                    //  返回响应信息  
63                    await response.WriteAsync("event:custom\r");
64                    await response.WriteAsync("data:自定义事件消息\r\r");
65
66                    while(await _channel.Reader.WaitToReadAsync())
67                    {
68                        var message = await _channel.Reader.ReadAsync();
69                        Trace.WriteLine("捕捉发送消息:"+message);
70                        await response.WriteAsync($"data:{message}\r\r");
71
72                        await response.Body.FlushAsync();
73                    }
74                }
75            });
76        }
77    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIS专业核心课程电子教材配套实验数据汇总(持续更新)

本文整合了GIS专业核心课程电子pdf教材,包括地理信息系统、地图学、遥感、摄影测量、遥感数字图像处理、工程测量、施工测量、GPS、数字测图、空间数据库、程序设计等,持续更新。 一、ArcGIS10实验教程(配套实验数据) 二、地理信息系统

Android数据手册:Android颜色码制表

在Android应用开发中经常要用各种控件&#xff0c;并为控件设置其背景颜色&#xff0c;使用各种不同的颜色为控件着色是很有必要的。 在Android系统中&#xff0c;各种颜色与其对应的码制如下所示&#xff1a; <resources> <color name"white">#ffffff…

Android之提示MIME type application/octet-stream cannot be inserted into **/images expected

1、问题 在三星手机(Androd10.0)我需要把图片插入系统图库,错误提示如下 AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.appsinnova.android.keepdrop/com.appsinnova.android.keepdrop.account.AboutActivity}: java.lang.Ille…

7月18日实习日志

今天的上午的工作和昨天一样&#xff0c;上午转发了三十篇&#xff0c;基本上没有遇到什么问题。下午还是转载视频和发稿。 转载于:https://www.cnblogs.com/a1107/p/5706351.html

短网址服务设计

短网址服务设计 背景 短网址服务&#xff0c;用来将输入的一个长网址转换为一个短网址&#xff08;比如附录中的案例&#xff09;&#xff0c;当用户请求这个短网址时&#xff0c;服务查询出真实的url; 设计这么一个短网址服务&#xff0c;需要考虑哪些点&#xff1f; 数据结构…

我抓到bit哥了,嘿嘿嘿(5)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

遥感、地理空间数据、全国基础数据下载网站大全汇总

本文收集整理了国内外常用的遥感、GNSS、地理空间数据下载网站,可以下载各种格式的矢量、栅格等数据,主要包括遥感影像、NDVI、太阳辐射、数字高程模型等各种地理空间数据,供GISer学习交流使用。 1. 地理空间数据云 该网站为国内学者使用最多的、数据下载方便的网站,可以…

RPA之基于FlaUI的微信发送消息给某人

本文由网友蓝创精英团队投稿&#xff0c;欢迎转载、分享原文作者&#xff1a;蓝创精英团队原文链接&#xff1a;https://kesshei.blog.csdn.net/article/details/124955177目的一直想实现微信的群发功能&#xff0c;但是&#xff0c;没有实现&#xff0c;原因有一条是怕违法&am…

Android之通过文件绝对路径获取音视频的时长和视频的缩略图

1 需求 遍历一个文件夹,需要获取音视频的时长和视频的第一帧图像 2 关键代码实现 获取本地音视频的时长(这里计算出来的是秒为单位),如果文件不是音视频,下面的函数会发生异常,也就是返回0,我们除了通过文件头来判断这个文件是音视频之后,然后再获取这个文件的时长,如…

1.8-zabbix服务端安装

zabbix 是另外一个用的比较多地监控工具&#xff0c;同样也需要 apachephp 的支持&#xff0c;但它比nagios 要多一个 mysql&#xff0c;因为它有数据需要存储。所以&#xff0c;安装 zabbix&#xff0c;必须要安装 mysql。cacti、nagios、zabbix都是用php写的网页&#xff0c;…

感受机房管理化繁为简-新款KVM使用心得

感受机房管理化繁为简-新款KVM使用心得 一、 背景 随着网络应用的不断增多&#xff0c;各地机房服务器数量也随之增加&#xff0c;利用多传统主机切换器的方式已经无法满足目前这种区域广、设备多人员紧缺的现状&#xff0c;而且即使是使用了一些远程管理软件&#xff0c;实现的…

我化身保姆为你提供 html 教学服务(6)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

那一年,我考入了西北师范大学GIS专业,然而我很迷茫,GISer的职业规划到底是怎样的?

那一年&#xff0c;我考入了西北师范大学&#xff0c;录取专业为地理信息系统&#xff0c;也就是常说的GIS&#xff0c;本科毕业后又考取了GIS专业的研究生&#xff0c;顺利毕业&#xff0c;进入了高校从事GIS教育工作。作为一个GISer&#xff0c;我相信有很多人跟我一样很迷茫…

Python自动化之语法基础

1 第一个程序 hello world 在Linux环境下执行 vim hello.py #!/usr/bin/env python #指定解释器 print("hello world") 运行Python程序 Python hello.py 第一行是指定解释器&#xff0c;另一种写法是#!/usr/bin/python&#xff0c;后者限制了Python的位置&#x…

jquery分页插件

jquery.mypagination.js 文件&#xff1a; /* * * * jquery分页插件* 1.0 zheng 2014-03-18 * 1.1 兼容url包含#号地址&#xff0c;GoToPage可以指定锚点&#xff08;特殊需求&#xff09;2014-04-10 09:00:34* 1.2 可以配置分页条列出页面数* 1.3 增加了页面码跳转功能* …

Android之如何分析手机系统相册图片和视频删除后保存的位置

1 需求 需要获取各种型号手机系统相册图片和视频删除后保存的位置 2 分析 1)我们可以通过在sdcard目录下进行相关查找文件夹关键字,对 "cycle"或者"trash"或者*galle*进行忽略大小写模糊查询都有文件夹 find . -iname *cycle* find . -iname *trash*…

WPF 实现水珠效果按钮组

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;普通的地球人原文地址&#xff1a;https://www.cnblogs.com/tsliwei/p/8041928.html相关知识这部分基本就是废话,网上都能找到,我只不过是整理了以下.建议先不看,用到的时候可以回来看看贝…

GetDisplayName 获取枚举的显示值

item.State.GetDisplayName(), 转载于:https://www.cnblogs.com/zhongku/p/4944315.html

组策略管理——软件限制策略(4)

编写软件限制规则 在前面几篇文章中讲了软件限制规则的基本概念&#xff0c;现在就来学习如何编写自定义软件限制策略。 编写规则应遵循的原则 首先&#xff0c;需要大家注意的是&#xff0c;软件限制策略应本着方便、安全、实用的原则来编写。限制规则灵活方便&#xff0c;自定…

我使用 html 反向输出自己打自己(7)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…