Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 服务器发送的事件未发送ASP.Net 4_C#_Asp.net_Server Sent Events - Fatal编程技术网

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

C# 服务器发送的事件未发送ASP.Net 4,c#,asp.net,server-sent-events,C#,Asp.net,Server Sent Events,我的服务器发送的事件不再发送。这种用法非常有效,现在有些东西已经改变了,可能是我正在以ASP.NET4应用程序的形式运行它。我使用的是一个非常标准的iHTTPRequest处理程序,它有一个循环,有一点线程超时,在我开始的时候,我会写这样的消息: 一条消息-注意:我下面这样分析消息的原因是,我不确定是否存在最大消息长度,因此为了将其视为一个潜在问题,我将其破解。不管怎样,忘了这一点吧,因为我现在用最基本的消息“活着”进行测试,所以它永远不会击中这个 public static void Writ

我的服务器发送的事件不再发送。这种用法非常有效,现在有些东西已经改变了,可能是我正在以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();
}
还有一点需要注意,我认为这一点非常重要,那就是消息最终确实会出现,但它们会同时出现,就像它们被缓冲一样。所以我已经玩过了,启用和禁用缓冲。我甚至调查了一下,以确保我的动态内容没有被压缩,虽然我不相信我有这个权利,但我非常确定它没有被压缩。如果有人说这是肯定的,这是我的问题,我会进一步调查

那是什么呢?这是一个.NET4ISM吗

**更新-在此插入最小样本-**

我在这里添加了一个脚本示例: 此应用程序循环10次,然后退出循环。这是实际的SSE服务,因此您应该将结果直接发送到您的浏览器,至少在chrome中,FF尝试下载该文件,并且没有测试其他浏览器。我希望在浏览器中看到的是data:alive to apear,在脚本终止之前不会显示任何内容,然后会显示所有data:alive事件。我以前用这种方法测试过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开发者工具中的“网络”选项卡,可以从您的

根本没有生成SSE-点击网络下的“其他”按钮,您通常可以在这里跟踪SSE数据流

在我的SSE中,我使用了一个简单的HTTPListener,它工作得很好,没有您提到的延迟,并且在使用它时,总是在浏览器之间正确显示


你最终找到了一个可用的解决方案吗?
        res.AddHeader("Content-Type", "text/event-stream")
        res.AddHeader("Cache-Control", "no-cache")
        res.AddHeader("Access-Control-Allow-Origin", "*")
        res.KeepAlive = True