Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 返回分块内容编码的MVC控制器_Asp.net_Asp.net Mvc_Http Headers_Chunked Encoding - Fatal编程技术网

Asp.net 返回分块内容编码的MVC控制器

Asp.net 返回分块内容编码的MVC控制器,asp.net,asp.net-mvc,http-headers,chunked-encoding,Asp.net,Asp.net Mvc,Http Headers,Chunked Encoding,所以我有一个MVC项目。这个MVC项目包含一个控制器,它需要将内容流回到客户端。流媒体开始时,无法确定内容长度(它是动态计算的)。因此,我打开HttpContext.Current.Response.OutputStream,并开始定期写入和刷新(我已经禁用了缓冲输出,并附加了相应的http头): 如果我随后强制流关闭: HttpContext.Current.Response.Close(); 它没有正确地结束分块内容(它没有在末尾附加长度为0的分块,以向客户端指示EOF) 如果我更优雅地关

所以我有一个MVC项目。这个MVC项目包含一个控制器,它需要将内容流回到客户端。流媒体开始时,无法确定内容长度(它是动态计算的)。因此,我打开HttpContext.Current.Response.OutputStream,并开始定期写入和刷新(我已经禁用了缓冲输出,并附加了相应的http头):

如果我随后强制流关闭:

HttpContext.Current.Response.Close();
它没有正确地结束分块内容(它没有在末尾附加长度为0的分块,以向客户端指示EOF)

如果我更优雅地关闭输出流:

HttpContext.Current.Response.End();

它正确地关闭了流(零长度块追加到末尾),但我得到了应用程序引发的异常,表明它无法将HTTP头插入到输出流中,因为流已经被写入了

在这两种情况下,控制器继续返回null(或EmptyActionResult)

我假设异常是由于MVC堆栈要求每个ActionResult在控制器完成执行后设置HTTP头导致的。如果是这种情况,如何在MVC中实现分块流

提前谢谢

编辑:引发的确切异常为:

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长度块的问题,因为现在客户端不需要它

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) 
HttpContext.Current.Response.Close();