//创建一个新的 EventSource 对象,规定发送更新的页面的 URL var source = new EventSource("api/MyAPI/ServerSentEvents"); //默认支持message事件 source.onmessage = function (event) { console.log(source.readyState); console.log(event); };
if(!!EventSource && typeof(EventSource)!=="undefined") { // 浏览器支持 Server-Sent // 一些代码.....}else{ // 浏览器不支持 Server-Sent..}
public class MyAPIController : ApiController { /// <summary> /// ...api/MyAPI/ServerSentEvents /// </summary> /// <returns></returns> [HttpGet, HttpPost] public Task<HttpResponseMessage> ServerSentEvents() { //Response.ContentType = "text/event-stream" //Response.Expires = -1 //Response.Write("data: " & now()) //Response.Flush() string data = "id: 123456\nevent: message\ndata: 666\n\n"; HttpResponseMessage response = new HttpResponseMessage { //注意:ContentType = "text/event-stream" Content = new StringContent(data, Encoding.GetEncoding("UTF-8"), "text/event-stream") }; return Task.FromResult(response); } }
retry: 10000\n event: message\n id: 636307190866448426\n data: 2017/05/18 15:44:46\n\n
var es = new EventSource('events'); es.onmessage = function(e) { console.log(e.data); };//自定义事件 myeventes.addEventListener('myevent', function(e) { console.log(e.data); });
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>HTML5 服务器发送事件(Server-Sent Events)-单向消息传递</title> <meta name="author" content="熊仔其人" /> <meta name="generator" content="2017-05-18" /></head><body> <h1>获取服务端更新数据</h1> <p id="result"></p><script>if(typeof(EventSource)!=="undefined") { //创建一个新的 EventSource 对象,规定发送更新的页面的 URL var source = new EventSource("api/MyAPI/ServerSentEvents"); //默认支持open事件 source.onopen = function (event) { console.log(source.readyState); console.log(event); }; //默认支持error事件 source.onerror = function (event) { console.log(source.readyState); console.log(event); }; //默认支持message事件 source.onmessage = function (event) { console.log(source.readyState); console.log(event); document.getElementById("result").innerHTML += event.data + "<br>"; }; //处理服务器响应报文中的自定义事件 source.addEventListener("CustomEvent", function (e) { console.log("唤醒自定义事件"); console.log(e); document.getElementById("result").innerHTML += e.data + "<br>"; }); }else{ document.getElementById("result").innerHTML="抱歉,你的浏览器不支持 server-sent 事件..."; }</script></body></html>
using System;using System.Net.Http;using System.Text;using System.Threading.Tasks;using System.Web.Http;namespace WebTest.Controllers { /// <summary> /// api/{controller}/{id} /// </summary> public class MyAPIController : ApiController { static readonly Random random = new Random(); /// <summary> /// ...api/MyAPI/ServerSentEvents /// </summary> /// <returns></returns> [HttpGet, HttpPost] public Task<HttpResponseMessage> ServerSentEvents() { //Response.ContentType = "text/event-stream" //Response.Expires = -1 //Response.Write("data: " & now()) //Response.Flush() string data = ""; if (random.Next(0, 10) % 3 == 0) { //唤醒自定义的CustomEvent data = ServerSentEventData("这是自定义通知", DateTime.Now.Ticks.ToString(), "CustomEvent"); } else { //唤醒默认的message data = ServerSentEventData(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), DateTime.Now.Ticks.ToString()); } HttpResponseMessage response = new HttpResponseMessage { //注意:ContentType = "text/event-stream" Content = new StringContent(data, Encoding.GetEncoding("UTF-8"), "text/event-stream") }; return Task.FromResult(response); } public string ServerSentEventData(string data, string id, string _event = "message", long retry = 10000) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("retry:{0}\n", retry); sb.AppendFormat("event:{0}\n", _event); sb.AppendFormat("id:{0}\n", id); sb.AppendFormat("data:{0}\n\n", data); return sb.ToString(); } } }
通信在页面上的显示结果:
通过Chrome监控网络交互时序:
通过Chrome浏览器控制台 输出,下面是一轮ope、message、error事件的详情:
至此,大功告成。
以上就是HTML5支持服务器发送事件的详细内容,更多请关注Gxl网其它相关文章!
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did40981