现如今程序员对Web API的调用已经是轻车熟路。但是传统的api调用都是拉模式,也就是主动发起请求去调用一个api.
但是程序员往往对另一种很有用的模式很陌生,即推模式。
-
拉模式 - 主动调用并获取结果的模式。
-
推模式 - 订阅并接受数据推送的模式。
今天要介绍的是一个被大家忽略但却非常有用的一项技术。
基于HTTP/2的标准服务器事件推送模式,英文简称Server-Sent Events,后面简称SSE。
Server-Sent Events这里引用MDN上的一段解释:
EventSource 是服务器推送的一个网络事件接口。一个EventSource实例会对HTTP服务开启一个持久化的连接,以
text/event-stream` 格式发送事件, 会一直保持开启直到被要求关闭。
一旦连接开启,来自服务端传入的消息会以事件的形式分发至你代码中。如果接收消息中有一个事件字段,触发的事件与事件字段的值相同。如果没有事件字段存在,则将触发通用事件。
与 WebSockets,不同的是,服务端推送是单向的。数据信息被单向从服务端到客户端分发. 当不需要以消息形式将数据从客户端发送到服务器时,这使它们成为绝佳的选择。例如,对于处理社交媒体状态更新,新闻提要或将数据传递到客户端存储机制(如IndexedDB或Web存储)之类的,EventSource无疑是一个有效方案。
以上解释简单说明了SSE的用途,该项技术也是推模式的典型技术之一。同类型的技术是WebSockets, 和SignalR。
代码是展示一项技术的最好办法:
SSE客户端实现//javascript 构造一个EventSource实例,代表一个服务器推送长连接。
var source = new EventSource("/api/values"); //传入支持推送模式的api url。随后展示。
//当普通消息被传递时触发。
source.onmessage = function (event) {
console.log('onmessage: ' + event.data);
};
//当连接打开时触发。
source.onopen = function(event) {
console.log('onopen');
};
//当出错时候触发
source.onerror = function(event) {
console.log('onerror');
}
//使用自定义时间时候触发。ping为自定义事件,你可以根据实际需求定义自己的事件名称。如果事件名称匹配,则该方法会被调用
source.addEventListener("ping", function(event) {
console.log('onping' + event.data);
});
ASP.NET Core Api 实现
[HttpGet]
public async Task GetValue()
{
//测试,debug到这里的时候你会发现,协议使用的是HTTP/2. APS.NET Core 2.1以上就默认支持HTTP/2,无需额外的配置。再Windows Server2016/Windows10+会自动提供支持。
string requestProtocol = HttpContext.Request.Protocol;
var response = Response;
//响应头部添加text/event-stream,这是HTTP/2协议的一部分。
response.Headers.Add("Content-Type", "text/event-stream");
for (int i=0;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?