Im Versuch, ein Web-API-Projekt (klassisches web.config-Projekt) zu migrieren, verwenden Sie PushStreamContent zur neuesten asp.net 5-Webanwendung (project.json).PushStreamContent in asp.net 5/mvc 6 funktioniert nicht
Mein Problem ist, dass ich PushStreamContent nicht funktionieren kann.
Wenn ich diese api Controller - ein Ergebnis wird in einem json-Format und nicht als Stream am Ende:
[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);
}
}
Wenn ich die Controller-Aktion ändern, um eine Aufgabe zurückzukehren und wickeln PushStreamContent in einer Klasse MyPushStreamResult - So:
[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);
}
}
eine Anfrage an meine Controller-Aktion nun einen Strom zurückkehrt, aber der Strom Spülung nicht, bevor es auf server schließen oder eine Menge von Daten enthält. Wenn ich Daten in den PushStreamContent-Ausgabestream pushe, spüe ich nach jedem Text-Schreibvorgang, aber ich denke, der Flush ist nicht auf dem response.Body-Stream.
Was vermisse ich? Kann keine Beispiele mit asp.net 5 Struktur finden.
die 'IHttpBufferingFeature' Funktion kann helfen, denke ich, haben Sie versucht, die Pufferung zu deaktivieren? –
es sieht aus wie die 'IHttpBufferingFeature' in Kestrel [docs] (http://docs.asp.net/de/latest/fundamentals/servers.html#supported-features-by-server) –
In dem ersten Beispiel nicht unterstützt wird Du schreibst niemals in den Stream. – usr