【问题标题】:EventSource; server-sent events事件源;服务器发送的事件
【发布时间】:2020-06-20 05:05:17
【问题描述】:

我正在尝试处理从浏览器发送到我的 C# WebServer 的 EvenSource。

当我收到 HTTP 请求 (Get /event/api/endpoint) .. 我回复: - 200 OK 和 - 内容类型:文本/事件流 - 正文:数据:空

控制台成功记录了信息。在服务器上,我保持连接打开并且响应流也打开。看来我的服务器没有通过已经打开的 TCP Response.Outputstream 发送后续事件。

浏览器(Chrome)发送新事件的问题,好像连接已关闭,但事实并非如此。

客户代码:

<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <title>SSE Test</title>
</head>
<body style="background: #fff;">
    <div id="infoPane">
    </div>
</body>
    <script>
    (function() {
        var infoPane = document.getElementById('infoPane');
        var report = function(msg) {
            var info = document.createElement('p'); 
            info.textContent = msg;
            infoPane.appendChild(info);
        };

        var source = 'http://localhost:8011/SSE/now';
        var loader = new EventSource(source);
        loader.onmessage = function (event) {
            report(event.data);
        };
    }());
    </script>
</html>

服务器代码:

var listener = new HttpListener();
listener.Prefixes.Add("http://+:8011/SSE/");
listener.Start();
Task.Run(() =>
{
    while (true)
    {
        var ctx = listener.GetContext();
        Task.Run(() =>
        {
            var response = ctx.Response;
            response.StatusCode = (int)HttpStatusCode.OK;
            response.ContentType = "text/event-stream";
            response.ContentEncoding = Encoding.UTF8;
            try
            {
                while (true)
                {
                    var msg = string.Format("data: it is now {0} Zulu\n\n", DateTime.UtcNow);
                    var bytes = Encoding.UTF8.GetBytes(msg);
                    response.OutputStream.Write(bytes, 0, bytes.Length);
                    response.OutputStream.Flush();
                    System.Threading.Thread.Sleep(1000);
                }
            }
            catch (HttpListenerException)
            {
            }
        });
    }
});

【问题讨论】:

    标签: javascript c# httplistener eventsource


    【解决方案1】:

    也修复了。

    这是来自 MSFT HttpListener 的限制 .. 我必须在 TCPClient 之上从头开始构建自己的 C# HTTP 和 HTTPS 网络服务器 .. 这肯定比 MSFT 实现好一百倍!

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 1970-01-01
      • 2013-12-05
      • 2015-09-24
      • 2015-06-16
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多