在实际情况中 可能用不上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