2

Я использую PushStreamContent в ASP.NET Web API для передачи событий от сервера к клиенту (используя Server-Sent Events). После каждого отправленного события я вызываю Flush на Stream, чтобы направить буферные данные клиенту. Однако я заметил, что промывка не всегда (всегда). Иногда часть данных отправляется клиенту, а остальная часть отправляется, когда записывается следующее событие (что может случиться через несколько секунд).ASP.NET Web API: PushStreamContent 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 
    } 
} 

Как я могу отключить буферизацию данных или заставить промывку данных?

+0

Вы нашли решение этой проблемы? – Kugel

+0

Нет, к сожалению, нет. –

ответ

-1

Источником проблемы является Поток, покрасневший.

На вашем образце кода вы деформируете исходный поток с помощью 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)); 
    } 
    } 
} 
+0

Не работает. outputStream ничего не делает. – Kugel

1

Я получил это работает.

В моем случае буферизация была isssue. Я должен был

1) отключить GZIP для моих ответов <urlCompression doStaticCompression="true" doDynamicCompression="false" />

2) Убедитесь, что прокси-сервер на Prod (Nginx) не буферные либо

+0

Настройка параметров web.config для меня. – Lukie

 Смежные вопросы

  • Нет связанных вопросов^_^