ASP.NET Web API中返回图像的推荐方法是什么?

87

如何以两个参数(x和y)的方式返回图像大小调整后的结果。

例如:

~/api/image12345/200/200

将返回一个200x200的jpg/png或gif

我应该返回一个System.Drawing.Image对象还是手动定义HTTPReponseMessage.Content


请查看我在这里的答案:https://dev59.com/bGkw5IYBdhLWcg3w8fFJ#20888749 - Ronnie Overby
2个回答

152

如果你没有添加一个知道如何将其转换为适当字节的格式化程序,就不应该返回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;
    }
}

但是,如果你需要在多个地方进行此操作,使用格式化程序可能是“推荐”的方式。就像编程中的几乎所有事情一样,答案取决于你的具体情况。


图片也应该使用using吗? - dibs487
GetImage方法在哪里? - Yoda
1
@Yoda,你的实现中的方法将返回需要传回客户端的图像。 - carlosfigueira
如果你要从硬盘返回一个文件,我认为最好使用FileStream来提高性能,就像这样(请参见此问题中的已接受答案):https://dev59.com/DGgu5IYBdhLWcg3wuJSF - John Gilmer

20

图片很占用资源。ASP.NET WebForms、HttpHandlers、MVC和Web API在提供静态文件方面的表现非常糟糕,而IIS的表现非常出色,效率通常要高20到100倍。

如果你想获得更好的性能,请在PostAuthorizeRequest阶段进行URL重写,这样IIS就可以获取并提供文件。是的,这意味着需要在HttpModule级别处理事件。

[免责声明:我是以下文章和开源项目的作者]

如果你正在处理动态图片,请查看避免图像处理陷阱这篇文章,并考虑了解ImageResizer。它具有出色的磁盘缓存(使用IIS静态文件处理),易于与任何类型的图像生成连接。如果需要进一步操作,它还有可选的AForge、FreeImage和WIC绑定。


2
我在我的项目中一直使用ImageResizer,并且非常满意它的工作方式 - 加上我的赞扬。唯一的抱怨是一些文档需要更新。 - Jon L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接