Nel tentativo di migrare un progetto Web api (classico progetto web.config), utilizzare PushStreamContent per l'ultima app Web asp.net 5 (project.json).PushStreamContent in asp.net 5/mvc 6 non funziona
Il mio problema è che non riesco a far funzionare PushStreamContent.
Quando uso questo controller api - di conseguenza finirà in un formato JSON e non come un flusso:
[Route("api/[controller]")]
public class EventsController : Controller
{
private static readonly ConcurrentQueue<StreamWriter> s_streamWriter = new ConcurrentQueue<StreamWriter>();
[HttpGet]
public HttpResponseMessage Get(HttpRequestMessage request)
{
HttpResponseMessage response = request.CreateResponse();
response.Content = new PushStreamContent(new Action<Stream, HttpContent, TransportContext>(WriteToStream), "text/event-stream");
return response;
}
private void WriteToStream(Stream outputStream, HttpContent headers, TransportContext context)
{
var streamWriter = new StreamWriter(outputStream) {AutoFlush = true};
s_streamWriter.Enqueue(streamWriter);
}
}
Se cambio l'azione di controllo per restituire un compito e avvolgere PushStreamContent in un MyPushStreamResult di classe - Ti piace questa:
[HttpGet]
public async Task<IActionResult> Get(HttpRequestMessage request)
{
var stream = new PushStreamContent(new Action<Stream, HttpContent, TransportContext>(WriteToStream), "text/event-stream");
return new MyPushStreamResult(stream, "text/event-stream");
}
public class MyPushStreamResult : ActionResult
{
public string ContentType { get; private set; }
public PushStreamContent Stream { get; private set; }
public MyPushStreamResult(PushStreamContent stream, string contentType)
{
Stream = stream;
ContentType = contentType;
}
public override async Task ExecuteResultAsync(ActionContext context)
{
var response = context.HttpContext.Response;
response.ContentType = ContentType;
await Stream.CopyToAsync(response.Body);
}
}
una richiesta alla mia azione di controllo è ora di tornare un ruscello, ma il flusso non si scarichi prima che vicino sul lato server o contiene un sacco di dati. Quando spingo i dati sul flusso di output di PushStreamContent, scarico dopo ogni scrittura di testo, ma suppongo che lo svuotamento non sia sulla risposta. Streaming.
Cosa mi manca? Non riesco a trovare campioni con la struttura di asp.net 5.
la funzione 'IHttpBufferingFeature' può essere d'aiuto, hai provato a disabilitare il buffering? –
sembra che "IHttpBufferingFeature' non sia supportato in Kestrel [docs] (http://docs.asp.net/en/latest/fundamentals/servers.html#supported-features-by-server) –
Nel primo esempio non scrivi mai allo stream. – usr