繁体   English   中英

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

[英]Server Sent Events not sent ASP.Net 4

我的服务器发送的事件不再发送。 这种用法可以完美地工作,现在发生了一些变化,可能是因为我将其作为ASP.Net 4应用程序运行。 我正在使用一个漂亮的标准iHTTPRequest处理程序,它带有一个循环,一点线程超时,然后我开始编写这样的消息:

消息-注意:按照下面的方式解析消息的原因是,我不确定是否有最大消息长度,因此为了消除这一潜在问题,我将其分解。 好吧,还是要忘掉这一点,因为我现在正在用最基本的消息“ alive”进行测试,因此它永远不会实现。

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尝试下载文件,并且未测试其他浏览器。 我希望看到的是数据:实时出现在浏览器中的数据:活动,直到脚本终止,然后所有数据:活动事件出现,什么都没有出现。 我之前已经以这种方式测试了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-要查看在Network(网络)下的Others(其他)​​按钮上的单击,通常可以在该位置跟踪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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM