Потоковое Json данных на ASP. NET ApiController - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь записать ApiController, который передает JSON данные в ответе. Это выглядит примерно так:

public class MyController : ApiController
{
    IDocumentWriter _writer;

    public MyController(IDocumentWriter writer)
    {
        _writer = writer;
    }

    [HttpGet]
    public async Task<HttpResponseMessage> Get()
    {
        var response = Request.CreateResponse(HttpStatusCode.OK);

        using (var stream = new MemoryStream())
        {
            response.Content = new StreamContent(stream);
            await _writer.WriteAsync(stream);
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            response.Content.Headers.ContentLength = stream.Length;
        }

        return response;
    }
}

IDocumentWriter принимает поток и записывает в него данные JSON. Вызов Get завершается неудачно с System.Threading.Tasks.TaskCanceledException, чего я не понимаю, потому что я жду WriteAsync. Конечно, он заканчивает писать, прежде чем вернуться? Что я делаю не так?

1 Ответ

1 голос
/ 10 января 2020

Я понял это благодаря этому посту . Оказывается, я был слишком усложнен. Вот окончательное решение;

[HttpGet]
public async Task<HttpResponseMessage> Get()
{
    var response = Request.CreateResponse(HttpStatusCode.OK);

    response.Content = new PushStreamContent(async (stream, content, context) =>
    {
        await _writer.WriteAsync(stream);
        stream.Close();
    }, "application/json");

    return response;
}
...