2011-12-01 27 views
5

tengo esta muy simple DTO:una imagen de un servicio WCF REST

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

Y este servicio muy simple:

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

En mi Global.asax, que tengo:

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

Ahora, cuando llamo esto desde mi navegador, obtengo una matriz de bytes en formato JSON. Bien hasta ahora. Ahora, ¿cómo convierto ese conjunto de bytes en una imagen?

O, ¿hay una mejor manera de hacerlo? Traté de cambiar byte[] a Stream, pero cuando llamo al servicio desde Firefox, la respuesta está vacía a pesar de un código de estado HTTP de 200. Estoy usando Firebug y Fiddler.

no creo que sea relevante, pero ya que un exceso de información no hace daño a nadie que no era un robot, aquí está el 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> 

En última instancia, creo que la pregunta es: ¿cómo usted devuelve un mapa de bits de un servicio WCF RESTful para que JavaScript se ejecute en el navegador puede lanzarlo en la pantalla?

+0

no puedo entender la lógica del voto hacia abajo aquí. –

Respuesta

4

Bueno hasta el momento. Ahora, ¿cómo convierto ese conjunto de bytes en una imagen?

Dado que ha etiquetado su pregunta con javascript, supongo que esto es lo que utiliza para consumir el servicio y desea mostrar la imagen en el navegador. Si este es el caso, puede echarle un vistazo al Data URI scheme que le permite mostrar la imagen dados los bytes que obtiene del servicio.

He aquí un ejemplo de cómo podría consumir dicho servicio utilizando jQuery y mostrar la imagen:

$(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'); 
     }); 
    }); 
}); 

La función $.base64.encode proviene de this plugin.

+0

Correcto. Estoy usando jQuery para consumir el servicio. – Amy

+0

Esto me ayudó mucho a pasar de un byte [] devuelto de WCF. ¡El truco era hacer exactamente lo que aquí se describe! La información de base64 es un complemento jQuery que se puede encontrar aquí http://archive.plugins.jquery.com/project/base64 – ranieuwe

0

El problema con el uso de WCF para hacer esto es que los marcos de servicios web (y WCF en particular), hacen una gran cantidad de suposiciones sobre la respuesta resultante. Cuando solicita una imagen de un servidor, el tipo de contenido de respuesta HTTP suele ser diferente al de una solicitud de API.

Es por eso que no creo que tal trabajo deba implementarse usando WCF. Me acaba de responder una pregunta similar pidiendo lo mismo, pero con WebAPI en lugar de WCF:

ASP .Net Web API downloading images as binary

serías mucho más feliz si sólo implementa una costumbre HTTP handler. Las API son para datos estructurados, y las imágenes no son datos estructurados, son binarios. Tienen su propio lugar en HTTP y creo que desacoplarlos de la API es una buena idea.

Cuestiones relacionadas