我试图迁移一个web api项目(经典web.config项目)那里使用PushStreamContent到最新的asp.net 5 web应用程序(project.json)。在asp.net 5/mvc 6 PushStreamContent不工作
我的问题是,我不能让PushStreamContent工作。
当我使用这个API控制器 - 结果将在一个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);
}
}
如果我改变控制器动作返回一个任务,并在一类MyPushStreamResult包装PushStreamContent - 像这样:
[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);
}
}
到我的控制器操作的请求,现在返回一个流,但该流不刷新它接近的服务器端或者包含大量数据的之前。当我将数据推送到PushStreamContent输出流时,我在每次写入文本后进行刷新,但我猜刷新不在response.Body流中。
我错过了什么?找不到任何具有asp.net 5结构的示例。
'IHttpBufferingFeature'功能可以帮助我想,你是否尝试禁用缓冲? –
它看起来像'IHttpBufferingFeature'不支持Kestrel [文档](http://docs.asp.net/en/latest/fundamentals/servers.html#supported-features-by-server) –
在第一个例子中你从不写信给流。 – usr