You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:36:10