asp.net – MVC Controller返回Chunked内容编码

前端之家收集整理的这篇文章主要介绍了asp.net – MVC Controller返回Chunked内容编码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我有一个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)

解决方法

我找到了解决方案.

HTTP 1.1标准规定,只有当请求模式保持活动状态时,必须使用0长度的块关闭分块编码

在保持活动模式下,客户端/服务器之间的连接将持续存在多个请求/响应.在此上下文中,需要使用零长度块来结束分块编码,因为客户端无法知道前一个响应何时结束.

如果指定“Connection:close”作为标题,而不是“Connection:keep-alive”,则连接不会在请求之间保持连接,客户端可以使用连接关闭作为响应终止的指示,并且不需要表示EOF的0长度块.

我刚刚决定使用以下方法手动关闭HttpResponse:

HttpContext.Current.Response.Close();

虽然之前已在代码中指定告诉客户端连接将在EOF时关闭.这解决了客户端没有收到0长度块的问题,因为现在客户端不需要它.

原文链接:https://www.f2er.com/aspnet/248689.html

猜你在找的asp.Net相关文章