在GitHub上参考此示例代码: https://github.com/DblV/StreamingWebApi/blob/master/StreamingService/StreamingService/Controllers/StreamingController.cs
我想流式传输存储在数据库中的内容,我的查询将其作为一系列blob返回(实际上是一个文件分成"块")。由于完整响应的潜在大小,我想流式传输,我按照以下示例进行操作:
paths
请注意public class FileController : ApiController
{
[HttpGet]
public HttpResponseMessage Get(string id, [FromUri] string contentType)
{
var message = new HttpResponseMessage(HttpStatusCode.OK);
message.Content = new PushStreamContent((stream, content, context) =>
{
GetFileContent(stream, int.Parse(id));
Thread.Sleep(1000);
stream.Close();
});
message.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
return message;
}
private void GetFileContent(Stream stream, int id)
{
var result = Query(reader => reader.GetStream(0), id);
foreach (var b in result)
{
b.CopyToAsync(stream);
stream.Flush();
}
}
private IEnumerable<Stream> Query(Func<DbDataReader,Stream> func, int id)
{
var command = // Not shown - SELECT command creating the result set
var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
yield return func(reader);
}
}
reader.Close();
}
的使用和展示位置。当我在浏览器中对此进行测试时,内容会下载到文件中,但如果没有Thread.Sleep
,则会在完成时挂起;使用Sleep
,它可以正常完成,并且最终的下载非常完美。
我的问题:Sleep
做什么可以避免挂起情况?我怀疑这是一个解决方案,而不是一个适当的解决方案;如果是这样,我应该做什么呢?
答案 0 :(得分:1)
发现这是我的错误。我错误地使用CopyToAsync
我应该使用CopyTo
。纠正这个错误,它运作得很好。