2009-07-21 9 views
9

हम एक सिल्वरलाइट MediaElement आधारित वीडियो प्लेयर के लिए वीडियो डेटा प्रदान करने के लिए एक FileStreamResult उपयोग कर रहे हैं:ASP.NET MVC FileStreamResult साथ आंशिक सामग्री स्ट्रीम कैसे

public ActionResult Preview(Guid id) { 
    return new FileStreamResult(
     Services.AssetStore.GetStream(id, ContentType.Preview), 
     "application/octet-stream"); 
} 

दुर्भाग्य से, सिल्वरलाइट वीडियो प्लेयर पूरे वीडियो फ़ाइल डाउनलोड करता है खेलना शुरू करने से पहले। यह व्यवहार अपेक्षित है क्योंकि हमारे Preview क्रिया आंशिक सामग्री डाउनलोड करने का समर्थन नहीं करती है।

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

हम कैसे नियंत्रक कार्रवाई आंशिक HTTP सामग्री का समर्थन करने के सुधार कर सकते हैं?

मुझे लगता है कि हमें पहले क्लाइंट को सूचित करना होगा कि हम इसका समर्थन करते हैं (एक "स्वीकृति-रेंज: बाइट्स" हेडर को हेड अनुरोध में जोड़ना), फिर हमें HTTP "रेंज" हेडर का मूल्यांकन करना होगा और अनुरोधित स्ट्रीम करना होगा 206 के प्रतिक्रिया कोड के साथ फ़ाइल रेंज। क्या यह आईआईएस 6 पर होस्ट किए गए एएसपी.नेट एमवीसी के साथ काम करेगा? क्या पहले से ही कुछ कोड उपलब्ध है?

यह भी देखें:

उत्तर

4

कोडप्लेक्स पर एक प्रोजेक्ट है जो यह सटीक कार्यक्षमता देता है।

http://mediastreamingmvc.codeplex.com/

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

0
  1. आप खुद इस लागू करने के लिए की है। और हाँ, यह आईआईएस 6 पर काम करेगा।
  2. यदि आप आईआईएस 7 का उपयोग कर सकते हैं तो शायद आप आईआईएस 7 एक्स्टेंसिबिलिटी (example) पर लाभ उठाने के लिए बेहतर हैं।
-1

तो फिर तुम थ्रॉटलिंग मॉड्यूल :) reimplement की जरूरत

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

Thread.Sleep (1000) वास्तव में आईआईएस संसाधनों से निपटने ताकि आप async तरह से सामान क्या करने की जरूरत के लिए एक अच्छा विचार नहीं है। IAsyncResult आपका दोस्त होगा।

सभी प्रकार के अनुकूलन के लिए बहुत अधिक जगह है।

और आखिरी बात ... मैंने इसे सादे प्रेजेंटफैंडर के रूप में काम किया, एमवीसी एक्शन रिसैट के रूप में नहीं। यदि यह आपके वेबिस्ट में संभव है, तो मैं इसे हैंडलर के रूप में करने की सिफारिश कर रहा हूं।