9

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

这是一个代码示例:

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
  }
}

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

4

3 回答 3

3

我让它工作了。

就我而言,缓冲是一个问题。我不得不

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

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

于 2016-11-28T07:39:41.390 回答
1

问题的根源是正在刷新的 Stream。

在您的代码示例中,您使用 StreamWriter 扭曲原始流,然后刷新 StreamWriter 。

您还需要刷新原始流:

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));
outputStream.Flush();
      await Task.Delay(TimeSpan.FromSeconds(1));
    }
  }
}
于 2015-07-20T15:24:01.697 回答
1

HttpSelfHostServer在花了一整天的时间试图找出问题所在,并(拼命地)给予赏金之后,我发现问题在于我使用TransferMode = TransferMode.Streamed的是HttpSelfHostConfiguration. 就这样。

于 2019-04-15T21:23:36.377 回答