大块的响应空(终止)的大块缺失

时间:2019-02-05 09:32:53

标签: asp.net http asp.net-core .net-core kestrel-http-server

我有一个控制器操作,该操作返回一个由数据源异步生成的CSV文档。我订阅了一个可观察的数据流,并使用Response.WriteAsync()写入了HTTP响应。似乎可以解决以下事实:终止(空)块在响应结束时丢失(对于终止30 0d 0a 0d 0a,十六进制的丢失数据为0\r\n\r\n)。

我有几个问题: -在这种情况下可以使用WriteAsync吗-数据输入时多次调用它-我当然不希望缓存整个数据集并立即返回它,因为它可能变得巨大 -谁负责写终止块(它也应该使用WriteAsync在OnComplete处理程序中显式地写吗?)

返回json对象的操作的示例响应(注意响应末尾的终止符):

HTTP/1.1 200 OK
Date: Tue, 05 Feb 2019 09:25:23 GMT
Server: Kestrel
Transfer-Encoding: chunked

21
{"results":[{"statement_id":0}]}

0

我的动作的响应:

HTTP/1.1 200 OK
Date: Tue, 05 Feb 2019 09:27:42 GMT
Content-Type: text/csv
Server: Kestrel
Transfer-Encoding: chunked

47
ID,Timestamp,BadQualityCount,MAX_value,MEAN_value,MIN_value,TotalPoints
65
...
5d
SwitchStatus_On_a797c2c2-de78-4fe8-9e4b-5d64f51d1e00,2019-0204T11:52:17.3680000Z,0,0,0,0,1

控制器代码:

          using (var disposable = observableContent.Subscribe(
                async current =>
                 await Response.WriteAsync(current), 
                () =>
                 {
                     //Response.WriteAsync(Environment.NewLine);
                     //Response.WriteAsync("0");
                     Response.Body.Flush();
                     completed = true;
                 }
            ))

                SpinWait.SpinUntil(() => completed);

            return Ok();

1 个答案:

答案 0 :(得分:0)

事实证明,如果将动作签名从“任务”更改为“任务”,终止符将正确写入。