c# 实现 Server-Sent Events (SSE),服务器单方面消息推送

在实际情况中 可能用不上SignalR 或者 websocket 这样全双工,太重的框架和技术,我们就可以用基于http协议本身的sse协议的实现我们想要的推送功能。

可以参考这一篇的 概念 zhuanlan.zhihu.com/p/21308648

或者 阮一峰 大佬的 这一篇 www.ruanyifeng.com/blog/2017/0…

核心代码

HomeController

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
 
        public ActionResult ServerSentEvents()
        {
            Random random = new Random();
            string _event = "message";
            string data = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
            if (random.Next(0, 10) % 3 == 0)
            {
                data = "新消息";
                _event = "NewMsg";
            }
 
            Response.ContentType = "text/event-stream";
            return Content($"retry:{1000}\nevent:{_event}\nid:{DateTime.Now.Ticks}\ndata:{data}\n\n");
        }
    }
复制代码

Index.cshtml

<h>主页</h>
<div id="result"></div>
<script type="text/javascript">
    if (typeof (EventSource) !== "undefined") {
        var source = new EventSource("../home/ServerSentEvents");
        source.onopen = function (event) {
            console.log(source.readyState);
            console.log(event);
        };
        source.onerror = function (event) {
            console.log(source.readyState);
            console.log(event);
            document.getElementById("result").innerHTML += "服务关闭 <br>";
        };
        source.onmessage = function (event) {
            console.log(source.readyState);
            console.log(event);
            document.getElementById("result").innerHTML += event.data + "<br>";
        };
        source.addEventListener("NewMsg", function (e) {
            console.log("唤醒新事件");
            console.log(e);
            document.getElementById("result").innerHTML += e.data + "<br>";
        });
    }
    else {
        document.getElementById("result").innerHTML = "抱歉,你的浏览器不支持 server-sent 事件...";
    }
</script>
复制代码

实现结果如下:

以前一直不懂,现在懂了。也实现了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享