C#实现Simple Server Sent Event无流式传输,事件流无记录
问题分析与修复方案
你的SSE服务端代码存在几个关键问题,导致浏览器无法捕获到事件流,逐一说明并给出修复方案:
1. 错误使用同步阻塞方法Thread.Sleep
在异步方法里用Thread.Sleep(500)会阻塞线程池线程,破坏异步流程的非阻塞特性,可能导致响应发送延迟或异常。
修复:
替换为异步延迟方法:
await Task.Delay(500);
2. 未禁用响应缓冲
ASP.NET Core默认会缓冲响应内容,直到请求处理完成才一次性发送给客户端。但SSE需要分块实时推送数据,缓冲会导致浏览器无法即时收到事件。
修复:
在SSEInitAsync方法中添加禁用缓冲及必要的响应头:
public static async Task SSEInitAsync(this HttpContext ctx) { ctx.Response.DisableBuffering(); // 禁用响应缓冲 ctx.Response.Headers.Add("Cache-Control", "no-cache"); ctx.Response.Headers.Add("Content-Type", "text/event-stream; charset=utf-8"); ctx.Response.Headers.Add("Connection", "keep-alive"); // 保持长连接 await ctx.Response.Body.FlushAsync(); }
3. 请求处理完成后响应立即关闭
你的SSE方法发送完一条数据后就执行完毕,ASP.NET Core会立即关闭HTTP连接。这种情况下,浏览器可能来不及解析事件,或者连接直接中断导致事件流无法被识别。
修复(测试单条推送场景):
给浏览器留一点时间接收数据,再结束请求:
[HttpGet("/sse")] public async Task SSE() { await HttpContext.SSEInitAsync(); await Task.Delay(500); await HttpContext.SSESendDataAsync("test"); // 延迟片刻,确保数据已发送到浏览器 await Task.Delay(100); }
额外检查点
- 确认浏览器端的EventSource代码正确,示例如下:
const eventSource = new EventSource('/sse'); eventSource.onmessage = function(event) { console.log('Received:', event.data); }; eventSource.onerror = function(error) { console.error('EventSource Error:', error); }; - 检查浏览器控制台是否有跨域或网络错误,如果是跨域场景,需在服务端配置CORS允许
text/event-stream类型的请求。
内容的提问来源于stack exchange,提问作者shehanpathi
相关产品推荐
相关产品推荐

