从RESTful WCF服务返回映像

我有这个非常简单的DTO:

[DataContract] public class DTO { [DataMember] public byte[] Image {get; set; } } 

这个非常简单的服务:

 [ServiceContract] public interface IFooService { [WebGet( UriTemplate = "", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] List GetDTOs(); } 

在我的global.asax中,我有:

 RouteTable.Routes.Add(new ServiceRoute("foo", new WebServiceHostFactory(), typeof(FooService))); 

现在,当我从浏览器调用它时,我得到一个JSON格式的字节数组。 目前很好。 现在,如何将该字节数组转换为图像?

或者,有没有更好的方法来解决这个问题? 我尝试将byte[]更改为Stream ,但是当我从Firefox调用该服务时,尽管HTTP状态代码为200,但响应为空。我正在使用Firebug和Fiddler。

我不认为它是相关的,但由于太多的信息从来没有伤害任何不是机器人的人,这里是web.config:

                       

最后,我想问题是:如何从WCF RESTful服务返回位图,以便在浏览器中运行的JavaScript可以在屏幕上抛出它?

目前很好。 现在,如何将该字节数组转换为图像?

由于您使用javascript标记了您的问题,我认为这是您使用服务所需的内容,并且您希望在浏览器中显示图像。 如果是这种情况,您可以查看数据URI方案 ,该方案允许您显示给定从服务获得的字节的图像。

这是一个如何使用jQuery消费此类服务并显示图像的示例:

 $(function () { $.getJSON('/foo/', function (dtos) { $.each(dtos, function (index, dto) { var str = String.fromCharCode.apply(String, dto.Image); $('', { alt: '', src: 'data:image/png;base64,' + $.base64.encode(str) }).appendTo('body'); }); }); }); 

$.base64.encode函数来自此插件 。

使用WCF执行此操作的问题在于Web服务框架(特别是WCF)对结果响应做出了很多假设。 从服务器请求映像时,HTTP响应内容类型通常与API请求的类型不同。

这就是为什么我认为不应该使用WCF实现这样的工作。 我刚刚回答了一个类似的问题,但是使用WebAPI而不是WCF:

ASP .Net Web API将图像下载为二进制文件

如果你只是实现一个自定义HTTP处理程序,你会更高兴。 API用于结构化数据,而图像不是结构化数据 – 它们是二进制的。 他们在HTTP中有自己的位置,我认为将它们与API分离是一个好主意。