У меня есть действие контроллера, которое возвращает CSV-документ, созданный асинхронно источником данных.Я подписался на наблюдаемый поток данных и пишу в ответ http с помощью Response.WriteAsync ().Кажется, это работает отдельно от того факта, что завершающий (пустой) блок отсутствует в конце ответа (отсутствующие данные в шестнадцатеричном формате 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();