2011-12-01 8 views
5

mam to bardzo prosty dto:Wracając obraz z relaksującego usługi WCF

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

i to bardzo prostą obsługę:

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

W moim global.asax, mam:

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

Teraz, gdy nazywam to przeglądarką, otrzymuję tablicę bajtów w formacie JSON. Dobre jak dotąd. Teraz, jak włączyć tę tablicę bajtów w obraz?

A może jest lepszy sposób na obejście tego? Próbowałem zmienić byte[] na Stream, ale kiedy zadzwonię do usługi z Firefoksa, odpowiedź jest pusta, mimo że kod statusu HTTP wynosi 200. Używam Firebuga i Fiddlera.

Nie sądzę, że to istotne, ale ponieważ zbyt wiele informacji nie zaszkodzi nikomu, kto nie był robotem, oto 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> 

Ostatecznie myślę, pytanie brzmi: jak zrobić zwracasz bitmapę z usługi WCF RESTful, więc JavaScript działający w przeglądarce może wyrzucić go na ekranie?

+0

Nie mogę zrozumieć logiki głosowania w dół tutaj. –

Odpowiedz

4

Dobra do tej pory. Teraz, jak włączyć tę tablicę bajtów w obraz?

Od czasu, gdy oznaczyłeś swoje pytanie na javascript, zakładam, że właśnie tego używasz do korzystania z usługi i chcesz wyświetlać obraz w przeglądarce. W takim przypadku możesz rzucić okiem na Data URI scheme, który pozwoli ci pokazać obraz podany w bajtach otrzymanych z usługi.

Oto przykład jak można spożywać taką usługę przy użyciu jQuery i pokazać obraz:

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

Funkcja $.base64.encode pochodzi this plugin.

+0

Prawidłowo. Używam jQuery do korzystania z usługi. – Amy

+0

To pomogło mi bardzo przejść z bajtu [] zwróconego z WCF. Sztuczka polegała na tym, żeby zrobić dokładnie to, co tutaj opisano! Informacje o base64 to wtyczka jQuery, którą można znaleźć tutaj http://archive.plugins.jquery.com/project/base64 – ranieuwe

0

Problem z używaniem WCF w tym celu polega na tym, że frameworki usług internetowych (w szczególności WCF) mają wiele założeń co do wynikowej odpowiedzi. Gdy żądasz obrazu z serwera, typ zawartości odpowiedzi HTTP jest zwykle inny niż żądanie API.

Dlatego nie sądzę, aby takie zadanie było realizowane za pomocą WCF. Ja po prostu odpowiedział na podobne pytanie zadaje to samo, ale z WebAPI niż WCF:

ASP .Net Web API downloading images as binary

Byłbyś wiele szczęśliwszy, gdyby po prostu wdrożyć zwyczaj HTTP handler. Interfejsy API są przeznaczone dla danych strukturalnych, a obrazy nie są danymi strukturalnymi - są binarne. Mają swoje własne miejsce w HTTP i myślę, że oddzielenie ich od API to dobry pomysł.

Powiązane problemy