使用ASP.Net的服务器发送事件无法正常通信

时间:2018-02-05 19:49:21

标签: javascript c# asp.net server-sent-events

我试图让SSE正常工作。我有一个带有两个按钮的简单网页。每个人都向服务器发送POST请求,将消息添加到列表中。

当eventsource正在侦听时,服务器每秒检查一次列表并将所有可用消息发送到客户端,同时将它们标记为已加入,这样它们就不会再被发送到该客户端。 / p>

它有点有用,但会做各种奇怪的事情:

  • 有时按钮POST请求会因没有明显原因而延迟,然后立即发送。
  • 有时,EventSource会重新启动自己向服务器发出GET请求。
  • 有时服务器在垃圾邮件按钮后调用Response.Flush()时会生成异常:“远程主机关闭连接。错误代码为0x800704CD”
  • 按下按钮几次后,当我尝试重新加载页面时,它会一直“加载”。

在javascript中启动EventSource后,它会生成一个保持打开的GET请求,之后,在事件源GET请求结束之前,永远不会发送按钮发送的任何POST请求。一旦EventSource连接结束,就会发送来自按钮的所有POST请求。

我知道这段代码中的很多东西都可以改进,但是我把它简化为“工作”只需要很多东西。

另请注意:

  • NotificationSystem.GetNotifications()以线程安全的方式获取用户可用的所有消息。
  • NotificationSystem.AddNotification()添加消息。

所以这是服务器代码:

      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>");
    }
});

0 个答案:

没有答案