1

经过数小时的谷歌搜索,我发现只有一个关于使用 asp.net(不是 MVC)的事件源的示例。首先我必须说我想学习它,我的最终目标是创建一个友好的扑克网站。SignalR 非常适合我的目的,但我不想使用它,因为我听说:

SignalR 性能不佳

不是吗?(​​我希望不是)。我的问题是当服务器向客户端发送响应时,它发送的不是当前文本:

$("#btnListen").click(function ()
        {
            var source = new EventSource('SSEHandler.ashx');
            source.addEventListener("open", function (event)
            {
                $('#headerDiv').append('Latest 5 values');
            }, false);
            source.addEventListener("error", function (event)
            {
                if (event.eventPhase == EventSource.CLOSED)
                {
                    $('#footerDiv').append('Connection Closed!');
                }
            }, false);
            source.addEventListener("message", function (event)
            {
                console.log(event.data);                   
            }, false);
        });

这是 SSEHandler:

 public class SSEHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }    

     public void ProcessRequest(HttpContext context)
    {
        HttpResponse Response;
        Response = context.Response;
        Response.ContentType = "text/event-stream"; 

        Response.Write(string.Format("data: {0}\n\n", "first"));
        Response.Flush(); //client has no response received yet 
        Response.Write(string.Format("data: {0}\n\n", "second"));
        Response.Flush();  //now client get "first".               
        Response.Close();

    }
}

执行此 cods 客户端控制台后,只有“第一”。如果我将其添加到 SSEHandler 的末尾:

Response.Write(string.Format("data: {0}\n\n", "third"));
Response.Flush(); 

在客户端控制台中,我们有“第一”、“第二”。感谢您阅读我的长文。

4

1 回答 1

0

您问这个问题已经有一段时间了,但是在我自己为此苦苦挣扎了一段时间之后,我找到了一种解决方法,我认为可以与其他有同样问题的人分享。

只需在每个事件后添加注释(以冒号开头的行),即可使事件在应有的时候出现。

Response.Write("data: first\n\n")
Response.Write(":comment\n")
Response.Write("data: second\n\n")
Response.Write(":comment\n")

注意:在处理动态发生的事件时问题更加明显,因为此时第一个事件不会在客户端上产生任何内容,然后当第二个事件发生时,第一个事件会显示在客户端中。这继续第二和第三等。

于 2017-08-28T09:15:53.007 回答