2012-09-04 17 views
14

मेरे पास एक एएसपी.नेट एमवीसी 4 वेब एपीआई नियंत्रक विधि है जो फ़ाइल आईडी की एक सूची उत्तीर्ण हो जाती है और उन फ़ाइलों के लिए थंबनेल छवियां लौटाती है।एक वेबएपी विधि से कई बाइनरी फ़ाइलों को प्रस्तुत करने का सबसे अच्छा तरीका क्या है?

तो, ग्राहक सांख्यिक आईडी की सूची में पारित हो सकता है (उदाहरण के लिए 10, 303, 29), और विधि एक सूची है, जहां एक ThumbnailImage इस तरह एक सा लग रहा है देता है:

class ThumbnailImage 
{ 
    public int Id { get; set; } 
    // Some other stuff 
    public byte[] RawData { get; set; } 
} 

कारण यह है कि कॉलर प्रति आइटम एक कॉल करने के बजाए आईडी की एक सूची में गुजरता है, उम्मीद है कि यह स्पष्ट हो सकता है - डाउनलोड करने के लिए दर्जन या सैकड़ों आइटम हो सकते हैं, और मैं उन सभी HTTP ट्रैफिक से बचने की कोशिश कर रहा हूं जिन्हें उन्हें व्यक्तिगत रूप से डाउनलोड करने की आवश्यकता होगी ।

वर्तमान में, मैं RestSharp और JSON.NET का उपयोग कर रहा हूं, और इसलिए मेरा थंबनेल छवि वस्तुएं तार पर JSON के रूप में पारित की जा रही हैं। यह सादगी-कोडिंग बिंदु दृश्य से ठीक है, लेकिन जेएसओएन उस बाइनरी डेटा का प्रतिनिधित्व करने का एक प्रभावी तरीका नहीं है।

तो, मुझे लगता है कि मुझे कच्चे बाइट को ऑक्टेट-स्ट्रीम के रूप में वापस करना चाहिए ... हालांकि, जबकि मैं इसे एक छवि के लिए आसानी से कर सकता हूं, मुझे यकीन है कि इसे करने का सबसे अच्छा तरीका नहीं है कई छवियों के लिए, विशेष रूप से जब मुझे प्रत्येक फ़ाइल के लिए आईडी और विविध अन्य जानकारी वापस करने की आवश्यकता होती है। (आईडी आवश्यक है क्योंकि परिणामों को किसी दिए गए क्रम में वापस नहीं किया जाएगा - और कुछ फाइलें गायब हो सकती हैं)।

मैं बस सब कुछ टुकड़ों प्रतिक्रिया धारा में लिख सकता है, ताकि प्रत्येक आइटम के लिए मैं आईडी (उपयुक्त रूप से इनकोडिंग), छवि डेटा की लंबाई के बाद, छवि डेटा खुद के द्वारा पीछा किया, और फिर लिखने का पालन किया आदि अगले आइटम के लिए एक ही बात,

फोन करने वाले तो बस आईडी की धारा से पढ़ने जब तक यह समाप्त हो गया था, एन्कोडिंग के बारे में मान्यताओं बनाने (और लंबाई!) रखेंगे, आदि

द्वारा मुझे लगता है कि यह काम करेगा, लेकिन यह गुंजाइश लगता है - क्या कोई बेहतर तरीका है?

+0

कैसे होगा ग्राहक छवियों का उपयोग करते हैं? क्या वेब पेज में प्रदर्शित होने के लिए छवियां हैं? या एक संग्रह के रूप में डाउनलोड करने के लिए? कुछ और? – EBarr

+0

आश्चर्य है कि क्या आप एक मल्टीपार्टकंटेंट के रूप में प्रतिक्रिया भेज सकते हैं जहां आंतरिक सामग्री स्ट्रीम सामग्री के बाइट्स की कच्ची धारा हो सकती है –

+0

@EBarr: मैं क्लाइंट एप्लिकेशन भी लिख रहा हूं, इसलिए यह एक बंद वातावरण है। मैं WinForms एप्लिकेशन (खोज परिणाम थंबनेल के रूप में) के भीतर छवियों को प्रदर्शित करूँगा। –

उत्तर

10

ठीक है, यहां काम करने के लिए प्रतीत होता है कि कोड का एक स्निपेट है, जो कि किरण चल्ला ने मल्टीपार्टकंटेंट का उपयोग किया है।(यह सिर्फ एक डमी नमूना दिखाता है कि कैसे एक JSON एन्कोड "वस्तु" (जो इस मामले में) पूर्णांक आईडी की सिर्फ एक सूची है साथ विभिन्न प्रकार के दो फ़ाइलों वापस जाने के लिए, संयोजन के रूप में है।

public HttpResponseMessage Get() 
{ 
    var content = new MultipartContent(); 
    var ids = new List<int>() { 1, 2 }; 

    var objectContent = new ObjectContent<List<int>>(ids, new System.Net.Http.Formatting.JsonMediaTypeFormatter()); 
    content.Add(objectContent); 

    var file1Content = new StreamContent(new FileStream(@"c:\temp\desert.jpg", FileMode.Open)); 
    file1Content.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("image/jpeg"); 
    content.Add(file1Content); 

    var file2Content = new StreamContent(new FileStream(@"c:\temp\test.txt", FileMode.Open)); 
    file2Content.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("text/plain"); 
    content.Add(file2Content); 

    var response = new HttpResponseMessage(); 
    response.Content = content; 
    return response; 
} 
+2

यह मेरे लिए काम नहीं कर रहा है। यह केवल एक फ़ाइल है जो वैध प्रारूप नहीं है। क्रिप्या मेरि सहायता करे। मैं इसके साथ अटक गया –

0

आप सभी थंबनेल से संपीड़ित फ़ाइल (उदा। एक ज़िप फ़ाइल) बना सकते हैं और उसे वापस भेज सकते हैं।

फिर कॉलर को इसे अपने अंत को अनजिप करना होगा - एक ही फाइल को एक फ़ाइल भेजना बहुत स्वीकार्य होगा और फिर एक ही स्ट्रीम में एकाधिक फाइलें भेजना होगा।

नुकसान यह है कि आप कैशिंग का लाभ लेने में सक्षम होने की संभावना कम हैं (पाठ्यक्रम के आपके उपयोग पैटर्न के आधार पर)।

+0

लेकिन फिर भी मुझे सभी संबंधित जानकारी (जैसे आईडी) पास करने के लिए एक ही समस्या है (यद्यपि एक अलग जगह पर) ... इसके अलावा, मुझे सच में नहीं लगता कि ज़िप की अनपैक करना क्यों आसान है फ़ाइलों की एक संगत धारा अनपैक? –

+1

@GaryMcGill 'ज़िप' व्यापक रूप से लागू किया गया है। यह सिर्फ संपीड़ित नहीं होता है, यह कई फ़ाइलों के लिए एक स्ट्रीम करने योग्य कंटेनर प्रारूप के रूप में भी कार्य करता है। आपके पास अपनी पहली फ़ाइल के रूप में संबंधित जानकारी के साथ "फ़ाइल" हो सकती है और फ़ाइल फ़ाइलों के रूप में वास्तविक फ़ाइलों की आईडी का उपयोग कर सकते हैं। यदि आप ज़िप के 'स्टोर' संपीड़न मोड का उपयोग करते हैं, तो यह प्रभावी रूप से प्रश्न में वर्णित 'नाम, लंबाई, बाइट्स' योजना होगी। –

1

एक चुनौती जो मैं देखता हूं वह यह है कि कॉलर को वापस भेजे जाने वाले चित्रों की संख्या के आधार पर उनके टाइमआउट मान को समायोजित करना होता है। अगर यह एक किताब की दुकान के लिए था, तो बहुत सारी छवियां वापस भेजी जा सकती हैं।

क्या होगा यदि आपने केवल प्रत्येक छवि के लिए यूआरएल वापस भेज दिया है और वास्तविक छवि प्राप्त करने के लिए इसे कॉलर तक छोड़ दिया है? इसका मतलब एकाधिक कॉल के साथ थोड़ा और अधिक ट्रैफिक होगा लेकिन कॉलर को बाद में जानकारी वापस मिल जाएगी और फिर कॉलर की आवश्यकता के आधार पर छवियां प्राप्त करेंगी।

मैं गलत हो सकता था, लेकिन मैंने सोचा कि बाकी के पीछे विचार प्रत्येक संसाधन को पहचानने के लिए छवियों का एक गुच्छा बंडल करना और संसाधन को बुला रहा था। बस एक विचार ...

+0

मैं सहमत हूं - शायद इस तरह की चीजों को बंडल करने के लिए बहुत ही भरोसेमंद नहीं है, लेकिन असल में मैं केवल (केवल) एप्लिकेशन लिख रहा हूं जो इस वेब सेवा का उपयोग करेगा, इसलिए मुझे लगता है कि यह ठीक है। –

+1

टाइम-आउट मान के बारे में अच्छा बिंदु, हालांकि जब से मैं क्लाइंट भी लिख रहा हूं, मैं उससे भी निपट सकता हूं। (मैं शायद एक बार में केवल एक दर्जन या तो अनुरोध करता हूं)। मुझे लगता है कि 100 छवियों को भेजने के लिए आवश्यक अतिरिक्त ट्रैफिक सहन करने के लिए बहुत अधिक है, और इसलिए उन्हें अलग-अलग लाने से मुझे सही नहीं लगता है। –

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

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