Im пытается перенести проект web api (классический проект web.config), используя PushStreamContent до последнего веб-приложения asp.net 5 (project.json).PushStreamContent в asp.net 5/mvc 6 не работает
Моя проблема в том, что я не могу заставить PushStreamContent работать.
Когда я использую этот апи контроллер - результат будет в конечном итоге в формате JSON, а не как поток:
[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);
}
}
Если изменить действие контроллера для возврата задачи и обернуть PushStreamContent в классе MyPushStreamResult - как это:
[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);
}
}
запрос на мой контроллер действий теперь возвращается поток, но поток не топить, прежде чем его закрыть на ServerSide или содержит большое количество данных. Когда я выталкиваю данные в выходной поток PushStreamContent, я стираю после каждого текстового ввода, но я думаю, что флеш не включен в поток response.Body.
Что мне не хватает? Невозможно найти образцы с структурой asp.net 5.
Функция 'IHttpBufferingFeature' может помочь, я думаю, вы пытались отключить буферизацию? –
похоже, что «IHttpBufferingFeature» не поддерживается в Kestrel [docs] (http://docs.asp.net/en/latest/fundamentals/servers.html#supported-features-by-server) –
В первом примере вы никогда не пишете в поток. – usr