事件源;服务器发送的事件
EventSource; server-sent events
我正在尝试处理从浏览器发送到我的 C# WebServer 的 EvenSource。
当我收到 HTTP 请求时 (Get /event/api/endpoint) .. 我回复:
- 200 OK 和
- 内容类型:text/event-stream
- 正文:数据:空
控制台成功记录信息。在服务器上,我保持连接打开并且响应流也打开。看来我的服务器没有通过已经打开的 TCP Response.Outputstream.
发送后续事件
浏览器(Chrome)发送新Event的问题,好像连接已关闭,但实际上并没有。
客户代码:
<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)
{
}
});
}
});
也修复了它。
这是 MSFT HttpListener 的限制。我不得不在 TCPClient 之上从头开始构建自己的 C# HTTP 和 HTTPS 网络服务器。这肯定比 MSFT 实施好一百倍!
我正在尝试处理从浏览器发送到我的 C# WebServer 的 EvenSource。
当我收到 HTTP 请求时 (Get /event/api/endpoint) .. 我回复: - 200 OK 和 - 内容类型:text/event-stream - 正文:数据:空
控制台成功记录信息。在服务器上,我保持连接打开并且响应流也打开。看来我的服务器没有通过已经打开的 TCP Response.Outputstream.
发送后续事件浏览器(Chrome)发送新Event的问题,好像连接已关闭,但实际上并没有。
客户代码:
<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)
{
}
});
}
});
也修复了它。
这是 MSFT HttpListener 的限制。我不得不在 TCPClient 之上从头开始构建自己的 C# HTTP 和 HTTPS 网络服务器。这肯定比 MSFT 实施好一百倍!