架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 183|回复: 1

[.NET Core] SSE(一)使用 ASP.NET Core 作为 SSE 服务器

[复制链接]
发表于 2024-4-5 11:54:12 | 显示全部楼层 |阅读模式
SSE 介绍

SSE 全称 Server-Sent Events,字面意思就是服务器向客户端推送信息。SSE是单向通道,只能实现服务端向客户端发送信息,客户端在第一次触发了SSE请求以后就只能接收,并不能回复。

QQ截图20240405114625.jpg

SSE 的主要特点包括:

  • 简单易用:SSE使用基于文本的数据格式,如纯文本、JSON等,使得数据的发送和解析都相对简单。
  • 单向通信:SSE支持服务器向客户端的单向通信,服务器可以主动推送数据给客户端,而客户端只能接收数据。
  • 实时性:SSE建立长时间的连接,使得服务器可以实时地将数据推送给客户端,而无需客户端频繁地发起请求。


SSE 与 WebSocket 的比较

WebSocket是另一种用于实现实时双向通信的Web技术,它与SSE在某些方面有所不同。下面是SSE和WebSocket之间的比较:

  • 数据推送方向:SSE是服务器向客户端的单向通信,服务器可以主动推送数据给客户端。而WebSocket是双向通信,允许服务器和客户端之间进行实时的双向数据交换。
  • 连接建立:SSE使用基于HTTP的长连接,通过普通的HTTP请求和响应来建立连接,从而实现数据的实时推送。WebSocket使用自定义的协议,通过建立WebSocket连接来实现双向通信。
  • 兼容性:由于SSE基于HTTP协议,它可以在大多数现代浏览器中使用,并且不需要额外的协议升级。WebSocket在绝大多数现代浏览器中也得到了支持,但在某些特殊的网络环境下可能会遇到问题。
  • 适用场景:SSE适用于服务器向客户端实时推送数据的场景,如股票价格更新、新闻实时推送等。WebSocket适用于需要实时双向通信的场景,如聊天应用、多人协同编辑等。
  • 根据具体的业务需求和场景,选择SSE或WebSocket取决于您的实际需求。如果您只需要服务器向客户端单向推送数据,并且希望保持简单易用和兼容性好,那么SSE是一个不错的选择。如果您需要实现双向通信,或者需要更高级的功能和控制,那么WebSocket可能更适合您的需求。


SSE 事件流格式

事件流是一个简单的文本数据流,文本应该使用 UTF-8格式的编码。事件流中的消息由一对换行符分开。以冒号开头的行为注释行,会被忽略。每个字段由字段名表示,后面是冒号,然后是该字段值的文本数据。

字段有以下几个:

event:用于标识事件类型的字符串。如果指定了这个字符串,浏览器会将具有指定事件名称的事件分派给相应的监听器;客户端应该使用 addEventListener() 来监听指定的事件。如果一个消息没有指定事件名称,那么可以调用onmessage 处理程序。
data:消息的数据字段。当 EventSource 接收到多个以 data: 开头的连续行时,会将它们连接起来,在它们之间插入一个换行符。末尾的换行符会被删除。
id:事件 ID,会成为当前 EventSource 对象的内部属性“最后一个事件 ID”的属性值。
retry:重新连接的时间。如果与服务器的连接丢失,浏览器将等待指定的时间,然后尝试重新连接。这必须是一个整数,以毫秒为单位指定重新连接的时间。如果指定了一个非整数值,该字段将被忽略。


EventSource 实例

该EventSource接口是 Web 内容与服务器发送事件的接口。

EventHandler 属性

EventSource.onopen 在连接打开时被调用。
EventSource.onmessage 在收到一个没有 event 属性的消息时被调用。
EventSource.onerror 在连接异常时被调用。

SSE 服务端(ASP.NET Core)

使用 .NET 8 新建一个 ASP.NET Core 项目,控制器代码如下:


对于建立链接的客户端,每间隔一秒发送一条消息给客户端。


SSE 客户端

在 View 页面使用 html 和 js 写客户端代码,如下:


启动项目,效果如下:

sse.gif

参考:
https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
https://developer.mozilla.org/en-US/docs/Web/API/EventSource
https://dev.to/masanori_msl/aspnet-core-try-server-sent-events-5db2




上一篇:使用 .NET 开发的 Garnet 缓存和 Redis 简单对比
下一篇:JS 监听 ctrl + enter 组合键
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-4-5 12:03:28 | 显示全部楼层
默认浏览器 EventSource API对允许发出的请求类型施加了一些限制:允许传入的唯一参数url是和withCredentials,因此:

您无法传入请求正文:您必须对 URL 中执行请求所需的所有信息进行编码,在大多数浏览器中,URL 的长度限制为 2000 个字符。
您无法传入自定义请求标头
您只能发出 GET 请求 - 无法指定其他方法。
如果连接被切断,您无法控制重试策略:浏览器会默默地为您重试几次,然后停止,这对于任何类型的健壮应用程序来说都不够好。


fetch-event-source

该库提供了一个基于 Fetch API 的备用接口,用于使用服务器发送的事件。它与事件流格式完全兼容,因此如果您已经有一个发出这些事件的服务器,您可以像以前一样使用它。但是,您现在可以更好地控制请求和响应

https://github.com/Azure/fetch-event-source
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-30 05:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表