2011-05-06 8 views
5

मेरे पास एक डब्ल्यूसीएफ सेवा है जो वेबगेट के माध्यम से एक स्ट्रीम वापस कर सकती है। यह अब तक ठीक काम कर रहा है। लेकिन मैं जो कार्यान्वित करना चाहता हूं वह रेंज हेडर के लिए समर्थन है, ताकि फ़ाइल के केवल कुछ हिस्सों को वापस कर दिया जा सके। यह मेरा कोड इतनी दूर है:डब्ल्यूसीएफ सेवा - रेंज के साथ फ़ाइलों को स्ट्रीम करने के लिए समर्थन: बाइट्स समर्थन?

public System.IO.Stream GetStream(string mElementID) 
{ 
     // build the filePath 
     FileInfo file = GetFile(mElementID); 
     try 
     { 
      FileStream videoStream = File.OpenRead(file.FullName); 

      if (request.Headers.AllKeys.Contains("Range")) 
      { 
       long startRange = ...; // get the start range from the header 
       long endRange = ...; // get the end range from the header 
       videoStream.Position = startRange; 
       // how can I set the end of the range? 
       //TODO: Don't forget to add the Content-Range header to the response! 
      } 

      WebOperationContext.Current.OutgoingResponse.ContentType = GetMimeType(file); 
      WebOperationContext.Current.OutgoingResponse.Headers.Add("Accept-Ranges", "bytes"); 
      return videoStream; 
     } 
     catch (FileNotFoundException){} 
     catch (IOException ex) 
     { 
      throw ex; 
     } 
     // throw a 404 
     throw new WebFaultException(System.Net.HttpStatusCode.NotFound); 
} 

मैं सिर्फ एक FileStream बनाते हैं, और लौटाते हैं। अब मुझे आश्चर्य है कि स्ट्रीम की एक श्रृंखला प्राप्त करने का सबसे अच्छा तरीका क्या है।

मुझे लगता है मैं रेंज की शुरुआत मूल्य के लिए videoStream.Position सेट कर सकते हैं, लेकिन क्या सबसे अच्छा तरीका है फ़ाइल फ़ाइल में कहीं में somwehere से एक हिस्सा प्राप्त करने के लिए है?

क्या मुझे मेमोरीस्ट्रीम बनाना है और उसमें प्रासंगिक बाइट्स लिखना है? यहां स्ट्रीम की गई फ़ाइलें वीडियो फ़ाइलें हैं, इसलिए काफी बड़ी हो सकती है।

उत्तर

2

जैसा कि आपने स्वयं को सुझाव दिया है आप कर सकते हैं। Filestream के साथ, सीमा की शुरुआत के लिए स्थिति सेट करें। अपनी इच्छित सीमा की लंबाई पर सेट एक बाइट सरणी बनाएं। तो वैकल्पिक रूप से

videoStream.Read(myByteArray, 0, myByteArray.Length) 

करते हैं, आप filestream के शुरू करने की स्थिति निर्धारित करते हैं, और जब FILESTREAM की शुरुआत से अपने आप को ऑफसेट करने के लिए पढ़ने के लिए कॉल दूसरा पैरामीटर का उपयोग कर सकते हैं।

एक बार जब आप बफर (बाइट सरणी) में पढ़ लेंगे तो आप इसे एक नई मेमोरी स्ट्रीम में रख सकते हैं (जिसमें एक ओवरलोडेड कन्स्ट्रक्टर है जो बाइट सरणी स्वीकार करता है)। फिर आप व्युत्पन्न स्मृति स्ट्रीम वापस कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद, बहुत अच्छी तरह से समझाया गया। जो मुझे चिंता है, वह स्मृति खपत है, क्योंकि वीडियो को पूरी तरह से स्मृति में पढ़ना है। जिस सेवा पर मैं काम कर रहा हूं, उसके पास कई उपयोगकर्ता नहीं होंगे, इसलिए शायद यह कोई समस्या नहीं होगी, लेकिन मैं सोच रहा हूं कि बेहतर तरीका हो सकता है, प्रदर्शन के अनुसार। – Malyngo

+1

आपकी प्रदर्शन चिंताओं के संबंध में एक दूसरा प्रश्न पोस्ट करना सार्थक हो सकता है। स्ट्रीम प्रदर्शन के लिए बहुत अच्छे हैं, और आपके मूल पोस्ट में दिखाए गए कार्यान्वयन के साथ, मुझे विश्वास नहीं है कि आप पूरी स्ट्रीम को स्मृति में लोड कर रहे हैं। मेरे सुझाव के अनुसार केवल बफर। उम्मीद है की वो मदद करदे। – Smudge202

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