使用ASP.NET中的Image Processing API诊断OutOfMemory问题

时间:2017-01-11 21:48:15

标签: c# asp.net azure

在我相对简单的Web API中运行OutOfMemory,该API部署到Azure服务器。我使用名为DownloadImageFromUrl(string url)的相同方法下载两个图像。然后,我只是在这些上绘制一些文本,进行大小调整,然后返回图像。其中一个是相对较大的图像文件,大小为1-12 MB。

这是我的DownloadImageFromUrl的实现,错误消息(和堆分析,见下文)指向我。两种方法都会导致相同的错误:

  private Bitmap DownloadImageFromUrl(string url)
    {
        //try
        //{
        //    // METHOD A:
        //    WebRequest request = System.Net.WebRequest.Create(url);
        //    WebResponse response = request.GetResponse();
        //    Stream responseStream = response.GetResponseStream();
        //    return new Bitmap(responseStream);
        //}
        //catch (WebException e)
        //{
        //    return null;
        //}
        //METHOD B:
        try
        {
            using (WebClient client = new WebClient())
            {
                byte[] data = client.DownloadData(url);
                using (MemoryStream mem = (data == null) ? null : new MemoryStream(data))
                {
                    return (data == null || mem == null) ? null : (Bitmap)Image.FromStream(mem);
                }
            }
        }
        catch (WebException e)
        {
            return null;
        }
    }

我的API非常好地处理单个请求。遇到请求爆破时会出现问题。当我同时发送20个内存时,内存最多会超过1g并抛出OutOfMemoryExceptions。在检查堆的快照时,我注意到为每个API调用创建了一个新的memorystream对象(其中20个),并且仅在内存峰值高潮时使用30,410,112个字节。

有人可以帮我修改我的API以一次处理更多用户请求吗?奇怪的是,在Azure上创建我的应用程序的更多实例实际上产生了更糟糕的结果。

编辑:我也考虑使用ImageMagick.NET来处理图像的绘制和调整大小,但这需要大修。

0 个答案:

没有答案