从WebApi返回图像

时间:2016-04-21 12:57:12

标签: c# asp.net-web-api

我正在制作Web Api,我需要将多个图像返回给客户端。我目前正在为每个图像使用Base64字符串,但这导致每个请求花费的时间太长。是否有更好,更有效的图像返回方式?

这是我正在使用的代码:

控制器:

    public LearningUnits GetLearningUnits([FromODataUri]Guid key)
    {
        var record = db.LearningUnits.SingleOrDefault(inst => inst.LearningUnitId == key);

        record.ImageURLPath = ImageHandler.ImageToByteArrayFromFilePath(record.ImageURLPath);

        return record;
    }

ImageToByteArray方法:

    public static string ImageToByteArrayFromFilePath(string imagefilePath)
    {
        byte[] imageArray = File.ReadAllBytes(imagefilePath);

        string baseImage = Convert.ToBase64String(imageArray);

        return baseImage;
    }

2 个答案:

答案 0 :(得分:1)

如果端点返回json,那么除base64之外没有其他方法可以在响应中嵌入二进制文件。但由于性能问题,这绝对是一个坏主意。可能对某些图标来说没关系,但对于较大的图像则不合适。

所以这里最好的解决方案是将url返回到图像。并且客户端将进一步请求获取图像的原始字节。

另外值得一提的是,图片网址不仅可以是静态文件的路径,还可以是某个webapi端点的路径,例如,通过资源ID获取图像字节并发送客户端原始二进制文件返回,而不是json字符串。

答案 1 :(得分:0)

解决方案是使用媒体格式化程序,以便在使用特定类型查询Web API时,您将接收特定类型的实际二进制流。

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

这是标准的RESTful模式;您有相同的URL,但是当您需要数据的JSON记录时,您接受类型:application / json,但是当您需要该媒体类型时,您可以将MIME请求类型更改为image / png或类似内容。

更多信息可以在这里找到: How to provide custom mediatype formats for OData Api

Odata也暗示支持它:https://msdn.microsoft.com/en-us/library/system.web.http.odata.formatter.odatamediatypeformatter(v=vs.118).aspx