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

Max*_*der 82 asp.net image asp.net-web-api

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

例如

~/api/image12345/200/200
Run Code Online (Sandbox Code Playgroud)

将返回200乘以200 jpg/png /或gif

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

car*_*ira 139

你不应该返回一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但同样,如果你在许多地方这样做,那么格式化路线可能是"推荐"的方式.作为编程中的几乎所有内容,答案将取决于您的场景.


Lil*_*ver 19

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

如果您希望获得良好的性能,请在PostAuthorizeRequest期间最迟进行URL重写,以便IIS可以选择并提供该文件.是的,这意味着HttpModule级事件处理.

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

如果你正在用图像做一些动态的东西,请查看这篇关于图像处理陷阱的文章以避免,并考虑看一下ImageResizer.它具有出色的磁盘缓存(使用IIS静态文件处理),并且易于连接到任何类型的图像生成.它还具有AForge,FreeImage和WIC的可选绑定,如果你需要先进的话.

  • 我一直在我的项目中使用ImageResizer,我很高兴它的工作原理 - 加上我.只有抱怨是一些文档需要更新. (2认同)