服务器发送的事件未发送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);
        }
    }
}

服务器发送的事件未发送ASP.Net 4

查看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