2011-12-01 18 views
5

मैं इस बहुत ही सरल डीटीओ है से एक छवि लौटने वाले:एक 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 में बदलने की कोशिश की, लेकिन फिर जब मैं फ़ायरफ़ॉक्स से सेवा कहता हूं, 200 के HTTP स्टेटस कोड के बावजूद प्रतिक्रिया खाली है। मैं फायरबग और फिडलर का उपयोग कर रहा हूं।

मुझे नहीं लगता कि यह प्रासंगिक है, लेकिन बाद से बहुत ज्यादा जानकारी किसी को भी, जो एक रोबोट नहीं था चोट कभी नहीं, यहाँ 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> 

अंत में, मुझे लगता है कि सवाल यह है: कैसे करना है आप डब्लूसीएफ रीस्टफुल सेवा से बिटमैप लौटाते हैं, इसलिए ब्राउज़र में चल रहे जावास्क्रिप्ट स्क्रीन पर इसे फेंक सकता है?

+0

मैं यहां नीचे वोट के तर्क को समझ नहीं सकता। –

उत्तर

4

अभी तक अच्छा है। अब, मैं बाइट्स की उस सरणी को एक छवि में कैसे बदलूं?

चूंकि आपने जावास्क्रिप्ट के साथ अपना प्रश्न टैग किया है, मुझे लगता है कि आप सेवा का उपभोग करने के लिए उपयोग करते हैं और आप ब्राउज़र में छवि को प्रदर्शित करना चाहते हैं। यदि ऐसा है तो आप Data URI scheme पर एक नज़र डाल सकते हैं जो आपको सेवा से प्राप्त बाइट्स दिए गए चित्र को दिखाने की अनुमति देगा।

$(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 से आता है:

यहाँ एक उदाहरण है कि कैसे आप jQuery का उपयोग कर ऐसी सेवा का उपभोग और छवि दिखा सकता है।

+0

सही। मैं सेवा का उपभोग करने के लिए jQuery का उपयोग कर रहा हूँ। – Amy

+0

इससे मुझे डब्ल्यूसीएफ से लौटे एक बाइट [] से स्थानांतरित करने में बहुत मदद मिली। चाल वास्तव में बिल्कुल वर्णन करने के लिए वास्तव में किया गया था! बेस 64 जानकारी एक jQuery प्लगइन है जो यहां http://archive.plugins.jquery.com/project/base64 पाया जा सकता है – ranieuwe

0

ऐसा करने के लिए डब्ल्यूसीएफ का उपयोग करने में समस्या यह है कि वेब सेवा ढांचे (और विशेष रूप से डब्ल्यूसीएफ), परिणामस्वरूप प्रतिक्रिया पर बहुत सारी धारणाएं करते हैं। जब आप किसी सर्वर से किसी छवि से अनुरोध करते हैं, तो HTTP प्रतिक्रिया सामग्री प्रकार आमतौर पर API अनुरोध के मुकाबले अलग होता है।

यही कारण है कि मुझे नहीं लगता कि ऐसा काम डब्ल्यूसीएफ का उपयोग करके लागू किया जाना चाहिए। मैं तो बस, एक ऐसी ही सवाल ही पूछ जवाब वेबएपीआई बजाय WCF के साथ लेकिन:

ASP .Net Web API downloading images as binary

आप अगर आप सिर्फ एक कस्टम HTTP handler लागू बहुत खुश होगी। एपीआई संरचित डेटा के लिए हैं, और छवियां संरचित डेटा नहीं हैं - वे बाइनरी हैं। उनके पास HTTP में अपना स्थान है और मुझे लगता है कि उन्हें एपीआई से डीकॉप्लिंग करना एक अच्छा विचार है।

संबंधित मुद्दे