C# Web API Server-Sent Events (SSE) 流逐字返回示例
以下是一个简单的 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 事件格式化为字节数组,并将其写入输出流。
原文地址: https://www.cveoy.top/t/topic/mqoe 著作权归作者所有。请勿转载和采集!