我试图让SSE正常工作。我有一个带有两个按钮的简单网页。每个人都向服务器发送POST请求,将消息添加到列表中。
当eventsource正在侦听时,服务器每秒检查一次列表并将所有可用消息发送到客户端,同时将它们标记为已加入,这样它们就不会再被发送到该客户端。 / p>
它有点有用,但会做各种奇怪的事情:
在javascript中启动EventSource后,它会生成一个保持打开的GET请求,之后,在事件源GET请求结束之前,永远不会发送按钮发送的任何POST请求。一旦EventSource连接结束,就会发送来自按钮的所有POST请求。
我知道这段代码中的很多东西都可以改进,但是我把它简化为“工作”只需要很多东西。
另请注意:
所以这是服务器代码:
public void GetNotifs() {
try {
Response.ContentType = "text/event-stream";
while(true) {
List<string> Notifs = NotificationSystem.GetNotifications( GetUserId() );
if(Notifs != null && Notifs.Count > 0) {
foreach(var Text in Notifs) {
Response.Write( string.Format( "data: {0}\n\n", Text ) );
}
Response.Flush();
}
Thread.Sleep( 1000 );
}
} catch(Exception ex) {
Response.Close();
}
}
public ActionResult AddButton1() {
NotificationSystem.AddNotification( GetUserId(), "BTN1 (" + GetUserId() + ")" );
return Json( "OK" );
}
public ActionResult AddButton2() {
NotificationSystem.AddNotification( GetUserId(), "BTN2 (" + GetUserId() + ")" );
return Json( "OK" );
}
客户端JS代码:
var urlMessages = "/Notifs/GetNotifs";
var urlButton1 = "/Notifs/AddButton1";
var urlButton2 = "/Notifs/AddButton2";
function PushBtn1() {
$.post(urlButton1);
}
function PushBtn2() {
$.post(urlButton2);
}
var myEventSource;
$(document).ready(function () {
myEventSource = new EventSource(urlMessages);
myEventSource.onmessage = function (e) {
console.log(e.data);
$('#EventLog').append("<li>Received: " + e.data + "<li>");
}
});