Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript asp.net中的事件源具有一个回合延迟的响应_Javascript_Asp.net_Eventsource - Fatal编程技术网

Javascript asp.net中的事件源具有一个回合延迟的响应

Javascript asp.net中的事件源具有一个回合延迟的响应,javascript,asp.net,eventsource,Javascript,Asp.net,Eventsource,经过数小时的谷歌搜索,我只找到了一个关于asp.net(不是MVC)事件源的示例。首先,我必须说我想学习它,我的最终目标是创建一个友好的扑克网站。信号器对我来说非常好,但我不想使用它,因为我听说: 信号员的表现很差 不是吗?(我希望不是)。我的问题是,当服务器向客户端发送响应时,它会发送上一个文本“非当前文本”: $("#btnListen").click(function () { var source = new EventSource('SSEHan

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

信号员的表现很差

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

$("#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);
        });
这是我的名字:

 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();

    }
}
Response.Write(string.Format("data: {0}\n\n", "third"));
Response.Flush(); 
执行此cods后,客户端控制台只有“第一个”。如果我将此添加到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();

    }
}
Response.Write(string.Format("data: {0}\n\n", "third"));
Response.Flush(); 
在客户端控制台中,我们有“第一”、“第二”。
感谢您阅读我的长篇博文。

您提出这个问题已经有一段时间了,但在我自己挣扎了一段时间后,我发现了一个解决方法,我认为可以与其他有同样问题的人分享

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

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

注意:当处理动态发生的事件时,问题更加明显,因为此时第一个事件不会在客户机上产生任何结果,然后当第二个事件出现时,第一个事件显示在客户机上。第二个和第三个等等。你问这个问题已经有一段时间了,但在我自己挣扎了一段时间后,我发现了一个解决方法,我认为可以与其他有同样问题的人分享

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

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

注意:当处理动态发生的事件时,问题更加明显,因为此时第一个事件不会在客户机上产生任何结果,然后当第二个事件出现时,第一个事件显示在客户机上。接下来是第二个和第三个等等。

试试信号器,看看它是否足够快,适合你的项目。上面的代码看起来不错,可能在关闭()之前尝试一个注释…谢谢@dandavis。我如何为40人同时使用它来测试信号器?请您在关闭前对添加注释做更多解释好吗?像keep alive这样的注释可能会导致客户端对所有发送的数据进行筛选。我不知道如何一次测试40个,也许在5台计算机上运行8个选项卡?再次感谢。每个浏览器都可以是一个客户端(我认为并将进行测试)。请您写下建议的代码(保持活动状态)?在最后一条消息之后(关闭()之前)打印
:保持我活动状态。使用incognito windows在一台设备上有多个会话。请尝试signalR,看看它是否足够快,适合您的项目。上面的代码看起来不错,可能在关闭()之前尝试一个注释…谢谢@dandavis。我如何为40人同时使用它来测试信号器?请您在关闭前对添加注释做更多解释好吗?像keep alive这样的注释可能会导致客户端对所有发送的数据进行筛选。我不知道如何一次测试40个,也许在5台计算机上运行8个选项卡?再次感谢。每个浏览器都可以是一个客户端(我认为并将进行测试)。请您写下建议的代码(保持活动状态)?在最后一条消息之后(关闭()之前)打印
:保持我活动状态。使用incognito windows在一台设备上有多个会话。