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

时间:2014-09-07 17:37:21

标签: c# asp.net server-sent-events

我的服务器发送的事件不再发送了。这种用法完美地工作,现在已经发生了变化,可能是我将它作为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);

        }
    }
}

1 个答案:

答案 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