一、课程介绍
很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。 HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。 今天我们要通过使用ASP.Net Core WebSocket技术来实现服务端向客户端实时推送消息(Real-Push-Message)。 一句话总结今天我们实现的目标? 如何在ASP.NET Core中使用WebSocket技术来实现服务端向指定的客户端实时推送消息。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。
二、WebSocket介绍
WebSocket是HTML5中的协议,支持持久连接;而Http协议不支持持久连接。 WebSocket是HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
主流浏览器对 HTML5 WebSocket 的支持情况
三、ASP.NET Core基于WebSocket实现消息推送实战演练
ASP.NET Core 中的 WebSocket 支持 | Microsoft Docs https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets?view=aspnetcore-3.1
使用步骤:
1、配置中间件
安装 Microsoft.AspNetCore.WebSockets 包。 在 Startup 类的 Configure 方法中添加 WebSocket 中间件: app.UseWebSockets(); 可配置以下设置: KeepAliveInterval - 向客户端发送“ping”帧的频率,以确保代理保持连接处于打开状态。 ReceiveBufferSize - 用于接收数据的缓冲区的大小。 高级用户可能需要对其进行更改,以便根据数据大小调整性能。 var webSocketOptions =new WebSocketOptions() { KeepAliveInterval = TimeSpan.FromSeconds(120), ReceiveBufferSize =4*1024}; }; app.UseWebSockets(webSocketOptions);
2、接受 WebSocket 请求
3、ASP.NET Core中WebSocket接收消息
配置在请求生命周期(例如在UseRouting和UseEndpoints中间),检查它是否是 WebSocket 请求并接受 WebSocket 请求。 AcceptWebSocketAsync 方法将 TCP 连接升级到 WebSocket 连接,并提供 WebSocket 对象。 使用 WebSocket 对象发送和接收消息。 WebSocket 请求可以来自任何 URL,但此示例代码只接受 /messagePushHub路径的请求。
4、ASP.NET Core中WebSocket发送消息
四、总结
在ASP.NET Core中对于大多数应用程序实现实时通讯的花,现在我们建议使用 SignalR,而不是原始 WebSocket。并且在大多数情况下,与使用原始 WebSocket 相比,SignalR 没有显著的性能缺点。 ASP.NET Core SignalR 是一个库,可用于简化向应用添加实时 Web 功能,它会优先尽可能地使用 WebSocket技术。SignalR 可为 WebSocket 不可用的环境提供传输回退。 它还可提供简单的远程过程调用应用模型。 如果大家感兴趣, 可以学习一下阿笨的《ASP.NET Core基于SignalR实现消息推送实战演练》课程。