【问题标题】:chunked response empty (terminating) chunk missing分块响应空(终止)块丢失
【发布时间】:2019-06-29 02:04:40
【问题描述】:

我有一个控制器操作,它返回由数据源异步生成的 CSV 文档。我订阅了一个可观察的数据流,并使用 Response.WriteAsync() 写入 http 响应。似乎除了响应末尾缺少终止(空)块这一事实之外(十六进制中缺少的数据是30 0d 0a 0d 0a,用于终止0\r\n\r\n)。

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

来自返回 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();

【问题讨论】:

  • 在 oncomplete 回调中手动写入 0 大小的块也不起作用,它不被识别为正确的响应终止符

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


【解决方案1】:

事实证明,如果动作签名从 Task 更改为 Task,则终止符是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2011-04-23
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多