如何使用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!"); } } }
- 如何在vNext Web应用程序中进行服务器端状态管理
- 如何在asp.net核心中编写中间件作为自定义路由器?
- ASP.NET 5中System.Web.Mvc.Html.InputExtensions的等价物是什么?
- ASP.NET 5 MVC 6中的TagBuilder InnerHtml
- 应用程序在添加Oauth时重定向到Account / AccessDenied
- ASP.NET Core Identity 3 Cookie超时
- ASP.NET Core 2.0 Preview 1:如何使用自定义登录路径设置Cookie身份validation
- 用户授权失败:(null)
- ASP NET Core修改/替换请求体