gpt4 book ai didi

c# - ASP.NET 网络 API : PushStreamContent flush does not flush

转载 作者:太空狗 更新时间:2023-10-29 20:30:27 27 4
gpt4 key购买 nike

我在 ASP.NET Web API 中使用 PushStreamContent 将事件从服务器推送到客户端(使用服务器发送事件)。每次发送事件后,我都会在 Stream 上调用 Flush 以将缓冲数据推送到客户端。但是,我注意到冲洗不会(总是)发生。有时,部分数据被发送到客户端,其余数据在写入下一个事件时发送(这可能会在几秒钟后发生)。

这是一个代码示例:

public class MyController : ApiController
{
private static readonly string[] LineSeparators
= new[] { Environment.NewLine };

public HttpResponseMessage GetData(string id)
{
var response = Request.CreateResponse();
response.Content = new PushStreamContent(
new Func<Stream, HttpContent, TransportContext, Task>(StartStream),
new MediaTypeHeaderValue("text/event-stream") { CharSet = "UTF-8" });
return response;
}

private async Task StartStream(Stream outputStream, HttpContent content, TransportContext context)
{
using (outputStream)
using (var writer = new StreamWriter(outputStream, new UTF8Encoding(false)))
{
writer.NewLine = "\n";
while (true)
{
WriteEvent(writer, "ping", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture));
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
}

private static void WriteEvent(TextWriter writer, string eventType, string data)
{
writer.WriteLine("event:" + eventType);
writer.WriteLine("data:" + data);
writer.WriteLine();
writer.Flush(); // StreamWriter.Flush calls Flush on underlying Stream
}
}

如何禁用数据缓冲或强制刷新数据?

最佳答案

我成功了。

在我的例子中,缓冲是一个问题。我不得不

1) 为我的回复禁用 gzip <urlCompression doStaticCompression="true" doDynamicCompression="false" />

2) 确保 Prod (Nginx) 上的代理也没有缓冲

关于c# - ASP.NET 网络 API : PushStreamContent flush does not flush,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29793308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com