下载 – 使用ASP.Net Webapi流式传输大图像

我们正在尝试使用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/发表了关于这种做法的博客.

这个例子使用了一个视频文件,其原理是一样的 – 把数据的数据推下给客户端.

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...