所以我有一个MVC项目.此MVC项目包含一个Controller,需要将内容流回客户端.当流式传输开始时,无法确定内容长度(它是在运行中计算的).所以我打开HttpContext.Current.Response.OutputStream,并定期开始写和刷新(我已经禁用了缓冲输出,并附加了相应的http头):
while (some condition){ HttpContext.Current.Response.OutputStream.Write(buffer,buffer.Length); HttpContext.Current.Response.Flush(); }
如果我然后强制关闭流:
HttpContext.Current.Response.Close();
它没有正确地结束Chunked内容(它不会在末尾添加0长度的块,以向客户端指示EOF).
HttpContext.Current.Response.End();
要么
HttpContext.Current.ApplicationInstance.CompleteRequest();
它正确地关闭了流(附加到结尾的零长度块),但是我得到了应用程序抛出的异常,表明它无法将HTTP头插入到输出流中,因为流已经被写入了!
在这两种情况下,Controller继续返回null(或EmptyActionResult).
我假设异常是由于MVC堆栈要求每个ActionResult在Controller完成执行后设置HTTP头而引起的.如果是这种情况,如何在MVC中实现Chunked流?
提前致谢!
编辑:抛出的确切异常是:
Uncaught Exception: System.Web.HttpException (0x80004005): Server cannot set status after HTTP headers have been sent. at System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult result) at System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)