以下是一个简单的 C# Web API 控制器,它可以向客户端发送 Server-Sent Events (SSE),逐字返回流:

using System.Web.Http;
using System.Threading.Tasks;
using System.Web;
using System.IO;

public class StreamController : ApiController
{
    [Route("api/stream")]
    public async Task<HttpResponseMessage> Get()
    {
        HttpResponseMessage response = Request.CreateResponse();
        response.Content = new PushStreamContent(async (Stream outputStream, HttpContent content, TransportContext context) =>
        {
            // 向客户端发送 SSE 的 MIME 类型和初始数据
            var sseEvent = new SseEvent('message', 'stream started');
            await outputStream.WriteAsync(sseEvent.GetBytes(), 0, sseEvent.GetBytes().Length);
            await outputStream.FlushAsync();

            // 模拟逐字返回流
            string longString = 'This is a long string that will be sent as an SSE stream, one character at a time.';
            for (int i = 0; i < longString.Length; i++)
            {
                sseEvent = new SseEvent('data', longString[i].ToString());
                await outputStream.WriteAsync(sseEvent.GetBytes(), 0, sseEvent.GetBytes().Length);
                await outputStream.FlushAsync();
                await Task.Delay(100); // 等待 100 毫秒
            }
        }, 'text/event-stream');

        // 设置响应头,允许跨域访问
        response.Headers.Add('Access-Control-Allow-Origin', '*');
        return response;
    }
}

public class SseEvent
{
    public string Event { get; set; }
    public string Data { get; set; }

    public SseEvent(string eventName, string data)
    {
        Event = eventName;
        Data = data;
    }

    public byte[] GetBytes()
    {
        // 将 SSE 事件格式化为字节数组
        string sseString = $'event: {Event}
data: {Data}

';
        return System.Text.Encoding.UTF8.GetBytes(sseString);
    }
}

在上面的控制器中,我们使用 PushStreamContent 类来逐字返回流。我们向客户端发送了一个初始的 SSE 事件,指示流已经开始。然后,我们使用一个简单的循环来逐字返回流,每 100 毫秒发送一个字符。我们还添加了一个响应头,允许跨域访问。最后,我们将 SSE 事件格式化为字节数组,并将其写入输出流。

C# Web API Server-Sent Events (SSE) 流逐字返回示例

原文地址: https://www.cveoy.top/t/topic/mqoe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录