服务器发送的事件未发送ASP.Net 4
本文关键字:Net ASP 事件 服务器 | 更新日期: 2023-09-27 18:21:09
我的服务器发送的事件不再发送。这过去工作得很好,现在有些事情发生了变化,可能是我把它作为ASP.Net4应用程序运行。我使用了一个非常标准的iHTTPRequest处理程序,它有一个循环,一个小的线程超时,然后我就开始写这样的消息:
消息-注意:以下面的方式解析消息的原因是,我不确定是否存在最大消息长度,所以为了将其作为一个潜在问题,我将其分解。好吧,不管怎样,忘记这一点吧,因为我现在正在用最基本的消息"活着"进行测试,所以它永远不会达到这个目的。
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);
}
}
}
查看Google Chrome开发工具中的"网络"选项卡可以发现http://live.meetscoresonline.com/test-sse.aspx
根本没有生成SSE-要查看此信息,请单击"网络"下的"其他"按钮,这是您通常能够跟踪SSE数据流的地方
我在SSE中使用了以下代码和一个简单的HTTPListener,它运行良好,没有您提到的延迟,并且在使用这个polyfill 时总是在浏览器中正确显示
res.AddHeader("Content-Type", "text/event-stream")
res.AddHeader("Cache-Control", "no-cache")
res.AddHeader("Access-Control-Allow-Origin", "*")
res.KeepAlive = True