[我正在尝试编写一个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
。它肯定在返回之前完成写操作吗?我在做什么错?
由于this post,我知道了。原来我是在使事情复杂化。这是最终的解决方案;
[HttpGet]
public 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;
}