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

我正在与ASP.NET Web Api玩弄,我很好奇的返回一个图像与2个参数(x和yresize)的最佳方式。

例如

~/api/image12345/200/200 

将返回200×200 JPG / PNG /或GIF

我应该返回一个System.Drawing.Image对象或手动定义HTTPReponseMessage.Content? 哪种方式是最高效的,开销较低。

您不应该返回一个System.Drawing.Image ,除非您还添加一个格式化程序,它知道如何将其转换为适当的字节不像您所期望的那样将其自身序列化为图像字节。

一个可能的解决scheme是返回一个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; } } 

但是,如果你在很多地方这样做,格式化程序可能是“推荐”的方式。 几乎所有的编程,答案将取决于你的情况。

图像很重。 ASP.NET WebForms,HttpHandlers,MVC和Web API都为静态文件提供了绝对可怕的工作。 IIS做得非常好 – 通常效率更高20-100倍。

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

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

如果你正在做一些dynamic的image processing ,请查看这篇关于image processing陷阱的文章以避免 ,并考虑看看ImageResizer 。 它具有出色的磁盘caching(使用IIS静态文件处理),并且很容易连接到任何forms的图像生成。 如果你需要先进的话,它也有可选的AForge,FreeImage和WIC绑定。