是否有推荐的方法使用ASP.NET Web API返回图像


Answers:


147

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;
    }
}

但是同样,如果您在许多地方都这样做,那么格式化程序路线可能是“推荐”的方式。正如编程中的几乎所有内容一样,答案将取决于您的情况。


图像也应该在使用中吗?
dibs487 2007年

GetImage方法在哪里?
Yoda

1
@Yoda是您实现中的方法,该方法将返回需要转移回客户端的图像。
carlosfigueira

如果要返回从硬盘文件,我认为这将是更好的性能,使用一个FileStream,像这样(见这个问题,接受的答案):stackoverflow.com/questions/11125535/...
约翰·吉尔默

19

图像太重。ASP.NET WebForms,HttpHandlers,MVC和Web API都在提供静态文件方面做得绝对糟糕。IIS在这方面做得非常好-效率通常提高20到100倍。

如果要获得良好的性能,请在PostAuthorizeRequest期间最晚进行URL重写,以便IIS可以提取并提供文件。是的,这意味着HttpModule级的事件处理。

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

如果您要对图像进行动态处理,请查阅有关避免图像处理陷阱的文章,并考虑查看ImageResizer。它具有出色的磁盘缓存(使用IIS静态文件处理),并且易于连接到任何类型的图像生成。如果需要高级功能,它还具有针对AForge,FreeImage和WIC的可选绑定。


2
我一直在我的项目中使用ImageResizer,并且对它的工作方式感到非常满意-另外我也很高兴。唯一的麻烦是一些文档需要更新。
乔恩L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.