返回具有2个参数(x和y用于调整大小)的图像的最佳方法是什么。
例如
~/api/image12345/200/200
将返回200 x 200 jpg / png /或gif
我应该返回System.Drawing.Image
对象还是手动定义HTTPReponseMessage.Content
?
Answers:
System.Drawing.Image
除非还添加了一个格式化程序,该格式化程序知道如何将其转换为适当的字节,否则不会将其自身序列化为图像字节,这是不应该返回的,除非您期望。
一种可能的解决方案是返回HttpResponseMessage
带有存储在其内容中的图像的,如下所示。请记住,如果您要在问题中显示的URL,则需要一条路由来映射{imageName},{width}和{height}参数。
public HttpResponseMessage Get(string imageName, int width, int height)
{
Image img = GetImage(imageName, width, height);
using(MemoryStream ms = new MemoryStream())
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(ms.ToArray());
result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
return result;
}
}
但是同样,如果您在许多地方都这样做,那么格式化程序路线可能是“推荐”的方式。正如编程中的几乎所有内容一样,答案将取决于您的情况。
GetImage
方法在哪里?
图像太重。ASP.NET WebForms,HttpHandlers,MVC和Web API都在提供静态文件方面做得绝对糟糕。IIS在这方面做得非常好-效率通常提高20到100倍。
如果要获得良好的性能,请在PostAuthorizeRequest期间最晚进行URL重写,以便IIS可以提取并提供文件。是的,这意味着HttpModule级的事件处理。
[免责声明:我是以下文章和开源项目的作者]
如果您要对图像进行动态处理,请查阅有关避免图像处理陷阱的文章,并考虑查看ImageResizer。它具有出色的磁盘缓存(使用IIS静态文件处理),并且易于连接到任何类型的图像生成。如果需要高级功能,它还具有针对AForge,FreeImage和WIC的可选绑定。