我的服务器发送的事件不再发送了。这种用法完美地工作,现在已经发生了变化,可能是我将它作为ASP.Net 4应用程序运行。我正在使用一个非常标准的iHTTPRequest Handler,它带有一个循环,一个小的线程超时,我可以写下这样的消息:
消息 - 注意:解析消息的原因与我在下面的方式一样,是因为我不确定是否存在最大消息长度,所以为了将其作为一个潜在的问题而消除,我将其分解。好吧忘了这一点,因为我现在正在测试最基本的消息“活着”所以它永远不会碰到这个。
public static void WriteClientMessage(this HttpResponse Response, string Message)
{
if (Message.Length > 50)
{
int start = 0;
int length = 50;
while (length > 0)
{
Response.Write("data: {0}\n", Message.Substring(start, length));
start = start + length;
length = Message.Substring(start, (Message.Substring(start).Length >= length) ? length : Message.Substring(start).Length).Length;
}
}
else
{
Response.Write("data: " + Message);
Response.Write("\n");
}
Response.Write("\n");
Response.Flush();
}
活动
public static void WriteClientEvent(this HttpResponse Response, string EventName)
{
Response.Write("event: {0}\n", EventName.TrimNewLine());
Response.Write("data: \n\n");
Response.Flush();
}
还有其他需要注意的地方,我认为这非常重要,最终消息确实会出现,但它们会立即出现,就像它们被缓冲一样。所以我玩过这个,启用和禁用缓冲。我甚至调查过以确保我的动态内容没有被压缩,虽然我不相信我有这个权利,但很确定它不是。如果有人说肯定是这个问题,我会进一步调查这个问题
那是什么?这是.Net 4ism吗?
**更新 - 在此处插入最小样本 - **
我在这里添加了一个脚本示例:http://live.meetscoresonline.com/test-sse.aspx 这个应用程序循环10次,然后突破循环。这是实际的SSE服务,因此您应该直接将结果发送到您的浏览器,至少在chrome中,FF尝试下载文件,并且没有测试过其他浏览器。我期望看到的是数据:当浏览器发生时,它会活跃到apear,而不会出现任何内容,直到脚本终止,然后出现所有数据:出现活动事件。我以前用这种方式测试了SSE,所以我知道这有用(或者用来工作)。这是测试代码。我错过了什么吗?
更新:我注释掉了休息以展示新行为。如果您等待大约20或30个循环,则实时流式传输开始并按预期继续。那么最初的暂停是什么?
public class TestSSE : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/event-stream";
var itt = 0; ;
while (true)
{
if (!context.Response.IsClientConnected)
break;
/* **** UPDATE: REMOVED THE BREAK. STREAMING BEGINS AFTER ABOUT THE 20TH OR 30TH LOOP ****/
// if (itt++ > 10)
// break;
context.Response.Write("data: alive {0}\n\n", DateTime.Now.ToLongTimeString());
context.Response.Flush();
System.Threading.Thread.Sleep(2000);
}
}
}
答案 0 :(得分:0)
查看Google Chrome开发者工具中的“网络”标签,可以从http://live.meetscoresonline.com/test-sse.aspx
中了解到很多内容根本没有生成SSE - 要点击网络下的其他按钮,这是您通常能够跟踪SSE数据流的地方
我使用简单的HTTPListener在我的SSE中使用以下代码,并且它没有您提到的延迟,并且在使用此polyfill
时始终在浏览器中正确显示 res.AddHeader("Content-Type", "text/event-stream")
res.AddHeader("Cache-Control", "no-cache")
res.AddHeader("Access-Control-Allow-Origin", "*")
res.KeepAlive = True