c# – asp.net 5 / mvc 6中的PushStreamContent无效
我试图迁移一个web api项目(经典的web.config项目),使用PushStreamContent到最新的asp.net 5 web应用程序(project.json).
我的问题是我无法让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,"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输出流时,我在每次文本写入后刷新,但我想flush不在response.Body流上. 我错过了什么?使用asp.net 5结构找不到任何样本. 解决方法
除非您使用的是Microsoft.AspNet.Mvc.WebApiCompatShim包,否则不会在ASP.NET 5中特别处理HttpResponseMessage.如果您可以使用ASP.NET 5功能执行类似的操作并且创建它以支持向后兼容性,则不建议使用此程序包.
因此,由于HttpResponseMessage不被认为是特殊的,它被JsonOutuptFormatter呈现为json,就像任何其他.NET对象一样 您当前可以通过HttpContext.Response.Body属性直接访问响应流,而不是PushStreamContent,因此您可以直接写入流. 更新: 总而言之,PushStreamContent允许直接写入响应流,在ASP.NET 5中我们可以直接访问流,因此您可以写入它. 更新: [HttpGet] public Task Get() { HttpContext.Response.ContentType = "text/event-stream"; var sourceStream = // get the source stream return sourceStream.CopyToAsync(HttpContext.Response.Body); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |