如何使用ASP.NET Core进行流式处理

如何正确地在ASP.NET Core中传输响应? 有这样的控制器( 更新代码 ):

[HttpGet("test")] public async Task GetTest() { HttpContext.Response.ContentType = "text/plain"; using (var writer = new StreamWriter(HttpContext.Response.Body)) await writer.WriteLineAsync("Hello World"); } 

Firefox / Edge浏览器显示

你好,世界

,Chrome / Postman报告错误:

localhost页面无效

localhost意外关闭了连接。

ERR_INCOMPLETE_CHUNKED_ENCODING

PS我即将流式传输大量内容,因此我无法提前指定Content-Length标头。

要将应该在浏览器中显示的响应流式传输为下载文件,您应该使用FileStreamResult

 [HttpGet] public FileStreamResult GetTest() { var stream = new MemoryStream(Encoding.ASCII.GetBytes("Hello World")); return new FileStreamResult(stream, new MediaTypeHeaderValue("text/plain")) { FileDownloadName = "test.txt" }; } 

这样的事情可能有用:

 [HttpGet] public async Task GetTest() { var contentType = "text/plain"; using (var stream = new MemoryStream(Encoding.ASCII.GetBytes("Hello World"))) return new FileStreamResult(stream, contentType); } 

我想知道如何做到这一点,并且发现原始问题的代码实际上在ASP.NET Core 2.1.0-rc1-final上工作正常,Chrome(以及其他一些浏览器)和JavaScript应用程序都不会失败这样的终点。

我想添加的一些小问题只是设置StatusCode并关闭响应Stream以使响应得到满足:

 [HttpGet("test")] public void Test() { Response.StatusCode = 200; Response.ContentType = "text/plain"; using (Response.Body) { using (var sw = new StreamWriter(Response.Body)) { sw.Write("Hi there!"); } } }