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