分块响应空的(终止)块丢失

问题描述 投票:0回答:1

我有,它返回一个数据源异步产生的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();
asp.net http asp.net-core .net-core kestrel-http-server
1个回答
0
投票

原来,如果动作签名从任务改为任务终止书写正确。

© www.soinside.com 2019 - 2024. All rights reserved.