Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.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 客户端始终响应上一个服务器发送的事件,而不是当前事件_Javascript_Asp.net Mvc_Server Sent Events - Fatal编程技术网

Javascript 客户端始终响应上一个服务器发送的事件,而不是当前事件

Javascript 客户端始终响应上一个服务器发送的事件,而不是当前事件,javascript,asp.net-mvc,server-sent-events,Javascript,Asp.net Mvc,Server Sent Events,我在代码中看到奇怪的行为 客户端(Javascript): 这就是实际发生的情况: 客户端服务器 ------------------------------------------------------------------- 按Ping按钮 XHR to/home/ping Eneque新项目到pings 消息循环问题服务器发送事件 (什么也没发生) 再次按下Ping按钮 新XHR到/主页/ping EventSource使用以前的事件数据调用消息 (在Chrome中运行时,消息请求在

我在代码中看到奇怪的行为

客户端(Javascript):

这就是实际发生的情况:

客户端服务器
-------------------------------------------------------------------
按Ping按钮
XHR to/home/ping
Eneque新项目到pings
消息循环问题服务器发送事件
(什么也没发生)
再次按下Ping按钮
新XHR到/主页/ping
EventSource使用以前的事件数据调用消息
(在Chrome中运行时,
消息
请求在网络选项卡中被列为始终挂起。我不确定这是服务器发送事件的正常行为,还是与问题有关。)

编辑

Response.Write
之后
msg
变量的字符串表示形式如下:

"data:{\"UserID\":105,\"Date\":\"2016-03-11T04:20:24.1854996+02:00\"}\n\n"

非常清楚地包括了换行符。

我不确定这是否有效,因为我现在无法尝试,但如何添加一个结尾

Response.Flush();
Response.End();

编辑:请先尝试创建对象,然后将其传递给Enqueue,好吗?例如:

PingData myData = new PingData { UserID = userID };
pings.Enqueue(myData);
当Dequeue认为它已经完成了任务,但是PingData对象的构造还不正确时,可能会发生一些奇怪的事情

我们还可以尝试使用
console.log(“我已使用该函数”)
而不是
console.log(e.data)

----下文要求提供以前的资料----

请确保服务器Debug.Print确认这行代码:

Response.Write("data:" + JsonConvert.SerializeObject(nextPing, Formatting.None) + "\n\n");
是否实际执行?请仔细检查此项。如果您可以捕获服务器发送的响应,那么我们可以看到它是什么吗


我们还可以看看您测试过的浏览器吗?并非所有浏览器都支持服务器事件。

这并不是一个简单的答案,但希望它能带来一个答案。我能够用下面的代码使它工作

public void Ping(int id)
{
    pings.Enqueue(new PingData { ID = id });
    Response.ContentType = "text/plain";
    Response.Write("id received");
}
public void Message()
{
    int count = 0;
    Response.ContentType = "text/event-stream";
    do {
        PingData nextPing;
        if (pings.TryDequeue(out nextPing)) {
            Response.ClearContent();
            Response.Write("data:" + nextPing.ID.ToString() + " - " + nextPing.Date.ToLongTimeString() + "\n\n");
            Response.Write("event:time" + "\n" + "data:" + DateTime.Now.ToLongTimeString() + "\n\n");
            count = 0;
            Response.Flush();
        }
        if (!Response.IsClientConnected){break;}
        Thread.Sleep(1000);
        count++;
    } while (count < 30);   //end after 30 seconds of no pings
}

net的默认行为是序列化对会话状态的访问。它会阻止并行执行。请求是按顺序处理的,对会话状态的访问是会话独占的。您可以覆盖每个类的默认状态

 [SessionState(SessionStateBehavior.Disabled)]
 public class MyPulsingController
 {
 }

问题中有一个例子说明了这一点。

因为事件流只是文本数据,在第一个事件写入响应之前缺少双线分隔符可能会影响客户端。这个例子表明

可以应用于.NET响应处理(注意
response.ClearContent()
的副作用)

如果感觉太黑,您可以在流开始时添加一条keep-alive注释(如果您想避免超时,您可能需要定期发送注释):

:只需一条保持活动状态的注释,然后两行换行,回复。请先给我写信


我已经在支持服务器发送事件的Chrome上进行了测试。AFAIK唯一不支持SSE的浏览器(假定为最新版本)是Internet Explorer/Edge。@ZevSpitz感谢您提供的信息。总是要确保这不是一件简单的事情。更新了答案,并尝试了一些东西。此外,如果您可以发布服务器响应,那么仍然可以看到服务器响应的样子。首先创建对象,然后将其传递到
队列
似乎没有帮助。我尝试了
console.log(“我将其传递到函数”)
作为
onmessage
处理程序;结果没有差异。检查此链接将帮助您检查是否有最新的js和.css更新。否则,添加过期和带有此链接的Expires标题将帮助您@Saineshwar您读过这个问题吗?(1) 我不需要刷新页面;我已经有了最新的Javascript。(2) Microsoft知识库与服务器发送的事件无关(也不能,因为它关注的是不支持服务器发送事件的Internet Explorer。
Response.End()
阻止所有事件。显然,连接已关闭,客户端意识到将不会有更多事件。这样做对问题没有影响。一旦我这样做,Chrome网络选项卡中的
消息
请求不再挂起,但问题仍然存在。@ZevSpitz:有趣,再次查看代码(前端和后端)我会检查服务器配置中的已知问题start@o.v.这就是我的问题,在我特定的sse路径上解决了这个问题。
<input type="text" id="pingid" placeholder="ID" /><br />
<input type="button" id="ping" value="Ping" />

<div id="timeresponse"></div>
<div id="pingresponse"></div>

<script>
    var es = new EventSource('/Home/Message');
    es.onmessage = function (e) {
        console.log(e.data);
        document.getElementById('pingresponse').innerHTML += e.data + " - onmessage<br/>";
    };
    es.addEventListener("ping", function (e) {
        console.log(e.data);
        document.getElementById('pingresponse').innerHTML += e.data + " - onping<br/>";
    }, false);
    es.addEventListener("time", function (e) {
        document.getElementById('timeresponse').innerHTML = e.data;
    }, false);
    es.onerror = function () {
        console.log(arguments);
        console.log("event source closed");
        es.close();
    };
    window.onload = function(){
        document.getElementById('ping').onclick = function () {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.onload = function () {
                console.log(this.responseText);
            };
            var url = '/Home/Ping?id=' + document.getElementById('pingid').value;
            xmlhttp.open("GET", url);
            xmlhttp.send();
        };
    };
</script>
 [SessionState(SessionStateBehavior.Disabled)]
 public class MyPulsingController
 {
 }
header("Content-Type: text/event-stream\n\n");