在我相对简单的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来处理图像的绘制和调整大小,但这需要大修。