我们正在尝试使用ASP.Net WebApi返回大图像文件,并使用以下代码将字节流传输给客户端.
public class RetrieveAssetController : ApiController { // GET api/retrieveasset/5 public HttpResponseMessage GetAsset(int id) { HttpResponseMessage httpResponseMessage = new HttpResponseMessage(); string filePath = "SomeImageFile.jpg"; MemoryStream memoryStream = new MemoryStream(); FileStream file = new FileStream(filePath,FileMode.Open,FileAccess.Read); byte[] bytes = new byte[file.Length]; file.Read(bytes,(int)file.Length); memoryStream.Write(bytes,(int)file.Length); file.Close(); httpResponseMessage.Content = new ByteArrayContent(memoryStream.ToArray()); httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); httpResponseMessage.StatusCode = HttpStatusCode.OK; return httpResponseMessage; } }
上面的代码工作正常,但我们处理的一些文件可能是2 GB和更大的大小导致连接超时.我们以前使用过的代码(使用HttpHandlers)来响应响应流来保持连接的成功.
byte[] b = new byte[this.BufferChunkSize]; int byteCountRead = 0; while ((byteCountRead = stream.Read(b,b.Length)) > 0) { if (!response.IsClientConnected) break; response.OutputStream.Write(b,byteCountRead); response.Flush(); }
我们如何使用类似的技术使用前面显示的新的WebAPI编程模型?
先谢谢你
解决方法
是的,您可以使用PushStreamContent.如果将它与异步执行(即异步lambdas)组合在一起,您可能会获得更有效的结果.
我在本月初 – http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/发表了关于这种做法的博客.
这个例子使用了一个视频文件,其原理是一样的 – 把数据的数据推下给客户端.