服务器发送事件(SSE)是HTML5规范的一部分。 SSE允许客户端和服务器之间的单向持久连接,使得客户端仅发出单个请求,并且服务器持续不断地将数据推送到客户端,直到连接关闭。
我需要使用一个 eventsource API,但它是一个私有 API,我需要传递一些身份验证标头,特别是授权标头,等等。 我查看了这两个箱子(
Puppeteer Scraper 无法访问 Node.js 服务器中已连接的客户端
我正在使用 Node.js、Express、Puppeteer 和 MongoDB 开发一个 Web 应用程序。我的目标是创建一个抓取工具,通过服务器发送事件 (SSE) 向连接的客户端发送实时更新。豪...
我对事件流的工作原理有基本的了解。我目前正在将 langchain 代码转换为直接使用 OpenAI 的 API,我有一段代码我有点困惑。 defstream_messag...
我尝试使用SSE将更新发送到客户端,但是当我在服务器端触发事件时,新数据不会发送到客户端。 我的客户端代码: $(文档).准备好(</desc> <question vote="1"> <p>我尝试使用SSE将更新发送到客户端,但是当我在服务器端触发事件时,新数据不会发送到客户端。</p> <p>我的客户端代码:</p> <pre><code><script> $(document).ready(function($) { var lastMsg = ''; const source = new EventSource("/misc/getData"); source.onmessage = function(event) { console.log(event); var data = JSON.parse(event.data); if (data !== lastMsg) { $('#result').empty(); $('#result').append('Result: ' + data); lastMsg = data; } }; }); </script> </code></pre> <p>我的服务器端代码(Laravel 类)</p> <pre><code><?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; class MiscController extends Controller { private $data; public function __construct() { $this->data = ''; } public function sendContent(Request $request) { $content = $request['content']; if (!is_null($content)) { $this->data = "data:". $content ."\n\n"; } $this->getData(); } public function getData() { return response($this->data)->withHeaders(['Content-Type'=>'text/event-stream', 'Cache-Control'=>'no-cache']); } } </code></pre> <p>没有显示错误,标题在浏览器控制台中看起来正常,但当服务器端设置数据时我无法获取数据。<br/> <pre><code>sendContent</code></pre> 方法在服务器端由其他类调用,或者从客户端使用 AJAX 调用,以设置需要反映在 UI 上的内容。</p> <p>然而,客户端的<pre><code>onmessage</code></pre>函数永远无法获取到它。</p> <p>我也尝试使用静态方法接收内容作为参数,但没有成功。</p> <p>我错过了什么?</p> </question> <answer tick="true" vote="0"> <p>这就是 Laravel 中 CORS 问题的答案。</p> <p>这与我之前使用的 Laravel 版本不同,但问题是相同的,因为我没有正确返回响应对象。也就是说,具有正确的标头以及包含在 Response 对象中的内容或有效负载。</p> <p><a href="https://stackoverflow.com/questions/78533267/laravel-11-cors-issue/78651491#78651491">Laravel 11 CORS 问题</a></p> </answer> </body></html>
无法使用 nginx、fastcgi 和 bash 禁用 cgi 上的缓冲
我想制作一个CGI来启动程序并在网络浏览器中实时显示输出。这里的实时意味着一旦程序产生一行输出,它就应该显示...
Eventsource API:例外:300000 毫秒内没有活动。重新连接
我正在使用 eventSource API 并将 addEventListener() 添加到 eventsouce。事件源仅激活 45 秒。我想保持连接处于活动状态,直到服务器发送响应...
我发现这里的代码有奇怪的行为。 客户端(Javascript): 我在代码这里看到了奇怪的行为。 客户端(Javascript): <input type="text" id="userid" placeholder="UserID" /><br /> <input type="button" id="ping" value="Ping" /> <script> var es = new EventSource('/home/message'); es.onmessage = function (e) { console.log(e.data); }; es.onerror = function () { console.log(arguments); }; $(function () { $('#ping').on('click', function () { $.post('/home/ping', { UserID: parseInt($('#userid').val()) || 0 }); }); }); </script> 服务器端(C#): using System; using System.Collections.Concurrent; using System.Threading; using System.Web.Mvc; using Newtonsoft.Json; namespace EventSourceTest2.Controllers { public class PingData { public int UserID { get; set; } public DateTime Date { get; set; } = DateTime.Now; } public class HomeController : Controller { public ActionResult Index() { return View(); } static ConcurrentQueue<PingData> pings = new ConcurrentQueue<PingData>(); public void Ping(int userID) { pings.Enqueue(new PingData { UserID = userID }); } public void Message() { Response.ContentType = "text/event-stream"; do { PingData nextPing; if (pings.TryDequeue(out nextPing)) { var msg = "data:" + JsonConvert.SerializeObject(nextPing, Formatting.None) + "\n\n"; Response.Write(msg); } Response.Flush(); Thread.Sleep(1000); } while (true); } } } 一旦我按下 ping 将新项目添加到 pings 队列中,Message 方法内的循环就会拾取新项目并通过 Response.Write 发出事件(在服务器上使用 Debug.Print 进行确认) )。但是,浏览器不会触发 onmessage,直到我第二次按 ping,并且浏览器发出另一个事件;此时,来自 first 事件的数据达到 onmessage。 我该如何解决这个问题? 澄清一下,这是我期望的行为: Client Server ------------------------------------------------------------------- Press Ping button XHR to /home/ping Eneque new item to pings Message loop issues server-sent event EventSource calls onmessage 这就是实际发生的事情: Client Server ------------------------------------------------------------------- Press Ping button XHR to /home/ping Eneque new item to pings Message loop issues server-sent event (Nothing happens) Press Ping button again New XHR to /home/ping EventSource calls onmessage with previous event data (在 Chrome 中运行时,message 请求在“网络”选项卡中列为始终处于待处理状态。我不确定这是否是服务器发送事件的正常行为,或者可能与该问题有关。) 编辑 msg之后的Response.Write变量的字符串表示如下所示: "data:{\"UserID\":105,\"Date\":\"2016-03-11T04:20:24.1854996+02:00\"}\n\n" 非常清楚地包括换行符。 这并不是一个答案,但希望它能带来一个答案。我能够使用以下代码让它工作。 public void Ping(int id) { pings.Enqueue(new PingData { ID = id }); Response.ContentType = "text/plain"; Response.Write("id received"); } public void Message() { int count = 0; Response.ContentType = "text/event-stream"; do { PingData nextPing; if (pings.TryDequeue(out nextPing)) { Response.ClearContent(); Response.Write("data:" + nextPing.ID.ToString() + " - " + nextPing.Date.ToLongTimeString() + "\n\n"); Response.Write("event:time" + "\n" + "data:" + DateTime.Now.ToLongTimeString() + "\n\n"); count = 0; Response.Flush(); } if (!Response.IsClientConnected){break;} Thread.Sleep(1000); count++; } while (count < 30); //end after 30 seconds of no pings } 产生差异的代码行是第二个Response.Write。该消息不会出现在浏览器中,直到下一个类似于您的问题的 ping 操作,但该 ping 操作始终会出现。如果没有该行,只有在下一个 ping 之后,或者在我的 30 秒计数器用完后,才会出现 ping。 30 秒计时器后出现的丢失消息让我得出结论,这要么是 .Net 问题,要么是我们遗漏了某些内容。这似乎不是事件源问题,因为该消息出现在服务器事件上,并且我使用 PHP 执行 SSE 没有遇到任何问题。 作为参考,这里是我用来测试的 JavaScript 和 HTML。 <input type="text" id="pingid" placeholder="ID" /><br /> <input type="button" id="ping" value="Ping" /> <div id="timeresponse"></div> <div id="pingresponse"></div> <script> var es = new EventSource('/Home/Message'); es.onmessage = function (e) { console.log(e.data); document.getElementById('pingresponse').innerHTML += e.data + " - onmessage<br/>"; }; es.addEventListener("ping", function (e) { console.log(e.data); document.getElementById('pingresponse').innerHTML += e.data + " - onping<br/>"; }, false); es.addEventListener("time", function (e) { document.getElementById('timeresponse').innerHTML = e.data; }, false); es.onerror = function () { console.log(arguments); console.log("event source closed"); es.close(); }; window.onload = function(){ document.getElementById('ping').onclick = function () { var xmlhttp = new XMLHttpRequest(); xmlhttp.onload = function () { console.log(this.responseText); }; var url = '/Home/Ping?id=' + document.getElementById('pingid').value; xmlhttp.open("GET", url); xmlhttp.send(); }; }; </script> 由于事件流只是文本数据,因此在将第一个事件写入响应之前缺少双换行符可能会影响客户端。 mdn docs 中的示例表明 header("Content-Type: text/event-stream\n\n"); 这可以应用于 .NET 响应处理(注意 Response.ClearContent() 的副作用)。 如果感觉太老套,您可以通过保持活动的评论开始您的流(如果您想避免超时,您可能需要定期发送评论): : just a keep-alive comment followed by two line-breaks, Response.Write me first 我不确定这是否有效,因为我现在无法尝试,但是添加一个 End 怎么样?: Response.Flush(); Response.End(); .net 的默认行为是序列化对会话状态的访问。它阻止并行执行。请求按顺序处理,并且对会话状态的访问是会话独有的。您可以覆盖每个类的默认状态。 [SessionState(SessionStateBehavior.Disabled)] public class MyPulsingController { } 问题中对此有一个说明这里。 编辑:您可以尝试先创建对象,然后将其传递给 Enqueue 吗?如: PingData myData = new PingData { UserID = userID }; pings.Enqueue(myData); 可能会发生一些奇怪的事情,Dequeue 认为它已经完成了工作,但 PingData 对象尚未正确构造。 我们也可以尝试用console.log("I made it to the function")代替console.log(e.data)。 ---- 以下要求提供的先前信息 ---- 请确保服务器Debug.Print确认这行代码: Response.Write("data:" + JsonConvert.SerializeObject(nextPing, Formatting.None) + "\n\n"); 实际执行了吗?请仔细检查这一点。如果您可以捕获服务器发送的响应,那么我们可以看到它是什么吗? 我们还可以看看您在哪些浏览器上进行了测试吗?并非所有浏览器都支持服务器事件。
我正在使用 Spring 的 SseEmitter 实现来处理 SSE。 就我而言,我想在服务器端找不到项目时处理错误并发送带有错误消息的事件。 我的第一个想法是......
使用 API 网关将 SSE 从 AWS 流式传输到 Angular 客户端
有哪些方法可以支持 AWS 中的服务器发送事件传输到 Angular 客户端?我们有一个基于微服务的 AWS 后端,使用 API 网关和 lambda。我们想发布真实的...
使用HttpServletRequest.newPushBuilder()实现SSE(服务器发送事件)总是返回null
我是 SSE 的新手 - 服务器发送事件实现。 我正在尝试使用 java jakarta.HttpServletRequest 实现 SSE。 导入java.io.IOException; 导入 jakarta.servlet.annotation.WebServlet; 我...
这样我就理解了服务器发送事件(EventSource)的概念: 客户端通过 EventSource 连接到端点 客户端仅监听从端点发送的消息 我很困惑的事情...
我正在开发一个使用 Nextjs/redis 的测试应用程序(目前)。 我的 sse 端点工作(有点)正确。当客户端连接时,它会检索快照并将其发回,当更新时...
我正在尝试在 NodeJS 服务器和 TypeScript 前端之间设置 SSE。我的服务器代码如下所示: 让 sseInterval: { [index: string]: NodeJS.Timer } = {}; this.app.get('/events/:id', ...
我正在尝试构建一个通知系统,在我的后端,在收到来自第三方的 Webhook 后,将通知前端特定状态,并决定继续进行
如何知道Nodejs(Nestjs)中客户端中止Http请求
所以我使用 Nestjs 和 Observable 来服务 SSE。 客户端将调用SSE API并等待服务器发送数据。 但客户也可以取消它。问题是我不知道如何知道客户端何时中止......
如何允许客户端中止信号通过 Nginx 入口控制器以进行 SSE 流事件?
我有一个后端Python Flask 服务器和一个前端react.js Web 应用程序。我有一个网络流 API,我在客户端上使用 fetch。我还希望客户能够终止
Node.js SSE res.write() 未在流中发送数据
我正在尝试在 NodeJs 中添加 SSE(服务器发送事件),但是当我使用 res.write() 发送响应时,数据没有被发送,而是只有在写入 res.end() 之后所有数据才会被发送在...
如何构建代理请求和响应的 JAX RS 资源? -- 也就是说,我可以转发请求和响应正文,可能会更改标头等次要细节 已尝试转发请求...
Undertow 2.X ServerSentEventHandler 未将数据流式传输到客户端
我有以下 Undertow 2.x ServerSentEventHandler 代码 公共类 SimpleServer { 公共静态无效主(字符串[] args){ Undertow 服务器 = Undertow.builder() .addHttpLi...
我有一个后端(Quart)API 作为事件源,它正在处理耗时的操作。该耗时任务需要大约 2 分钟的时间才能生成一些响应。 为了保持连接...