2011-12-01 94 views
5

我有一个非常简单的DTO返回图像:从一个RESTful WCF服务

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

而这个非常简单的服务:

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

在我的Global.asax,我有:

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

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

或者,有没有更好的方法去做这件事?我试着将byte[]更改为Stream,但是当我从Firefox调用服务时,尽管HTTP状态码为200,响应仍为空。我正在使用Firebug和Fiddler。

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

<?xml version="1.0"?> 
<configuration> 
    <system.serviceModel> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior> 
        <serviceMetadata httpGetEnabled="true"/> 
        <serviceDebug includeExceptionDetailInFaults="false"/> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true"> 
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     </modules> 
    </system.webServer> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
</configuration> 

最后,我想这个问题是:如何做你从WCF RESTful服务返回一个位图,所以在浏览器中运行的JavaScript可以把它放在屏幕上?

+0

我无法理解这里投票的逻辑。 –

回答

4

目前为止还不错。现在,我该如何将这些字节数组转换为图像?

既然您已经用JavaScript标记了您的问题,我假设这是您使用的服务,并且您希望在浏览器中显示图像。如果出现这种情况,您可以查看Data URI scheme,这将允许您显示给定您从服务获取的字节的图像。

这里有一个例子,你可以如何使用jQuery消费这样的服务,并显示图像:

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

$.base64.encode功能来自this plugin

+0

正确。我正在使用jQuery来使用该服务。 – Amy

+0

这帮助我从WCF返回的一个byte []移动了很多东西。诀窍的确如此处描述! base64信息是一个jQuery插件,可以在这里找到http://archive.plugins.jquery.com/project/base64 – ranieuwe

0

使用WCF来做到这一点的问题是,Web服务框架(尤其是WCF)对结果响应做出了很多假设。当您从服务器请求图像时,HTTP响应内容类型通常与API请求的内容类型不同。

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

ASP .Net Web API downloading images as binary

你会更快乐,如果你只是实现自定义HTTP handler。 API用于结构化数据,而图像不是结构化数据 - 它们是二进制的。他们在HTTP中有自己的位置,我认为将它们与API解耦是一个好主意。