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

Posted

技术标签:

【中文标题】是否有推荐的方法来使用 ASP.NET Web API 返回图像【英文标题】:Is there a recommended way to return an image using ASP.NET Web API 【发布时间】:2012-09-10 03:48:12 【问题描述】:

返回具有 2 个参数(x 和 y 用于调整大小)的图像的最佳方法是什么。

例如

~/api/image12345/200/200

将返回 200 x 200 jpg/png/或 gif 格式

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

【问题讨论】:

在这里查看我的答案:***.com/a/20888749/64334 【参考方案1】:

您不应该返回 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 方法在哪里? @Yoda 这是您实现中的方法,它将返回需要传输回客户端的图像。 如果您从硬盘驱动器返回文件,我认为使用 FileStream 会更好,如下所示(请参阅此问题中接受的答案):***.com/questions/11125535/…【参考方案2】:

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

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

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

如果您正在对图像进行动态处理,请查看out this article on image processing pitfalls to avoid,并考虑查看ImageResizer。它具有出色的磁盘缓存(使用 IIS 静态文件处理),并且易于连接到任何类型的图像生成。如果您需要进阶,它还具有 AForge、FreeImage 和 WIC 的可选绑定。

【讨论】:

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

以上是关于是否有推荐的方法来使用 ASP.NET Web API 返回图像的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Razor Pages 是在 Asp.net Core 中创建 Web UI 的推荐方法?

具有高度的 ASP.NET 模拟

如何在 Asp.net MVC 中编写 OAuth2 Web API 客户端

全局记录来自 ASP.NET [ScriptService] 服务的异常

从 ASP.Net 扫描图像

ASP.NET Web Pages - 添加 Razor 代码