2010-02-01 9 views
9

यहाँ का उपयोग करना सेटअप है: जो करने के लिए अपने उपयोगकर्ताओं (पर एक MySQL डाटाबेस में संग्रहित कहा सर्वर) को प्रमाणित एक सी # एप्लिकेशन चलासुरक्षित बड़े डाउनलोड सी # और आईआईएस 7

  • 1 वेब सर्वर।

  • 1 फ़ाइल सर्वर चल रहे सॉफ्टवेयर टीबीडी। अतीत में मैंने फ़ाइल सर्वर पर फ़ाइलों को सुरक्षित करने के लिए lighttpd और mod_secdownload का उपयोग किया है, और यह अच्छी तरह से काम किया है (ish)।

मुझे आश्चर्य है कि आईआईएस और सी # नेट के संयोजन का उपयोग करने का कोई तरीका है या नहीं। मेरे सभी अन्य सर्वर उस कॉम्बो को चला रहे हैं, और अगर मैं फाइल सर्वर के लिए ऐसा कर सकता हूं तो यह चीजों को थोड़ा सा सरल बना देगा। किकर है, होस्ट की जा रही फाइलें बड़ी हैं। मैंने फाइलस्ट्रीम ऑब्जेक्ट बनाने, फ़ाइल में पढ़ने और हाथ से HTTP प्रतिक्रिया बनाने के लिए छोटे ऐप का उपयोग करने वाले लोगों के उदाहरण देखे हैं। यह काम करता है, लेकिन चूंकि मैं आकार में 500+ एमबी फाइलों के साथ काम कर रहा हूं, यह बिल्ली के रूप में धीमा है। और फाइलों का अनुरोध करते हुए, मेरे पास संभावित रूप से 300 उपयोगकर्ता बॉक्स को मार देंगे। यह अच्छा नहीं है।

तो, कोई भी इस के आसपास एक रास्ता देखता है? मैं एक और पारदर्शी प्रणाली बनाने की कोशिश कर रहा हूं, और यदि मेरे सभी सर्वर एक ही सॉफ्टवेयर/हार्डवेयर चला रहे हैं, तो यह मेरे जीवन को एक बहुत आसान बना देगा। आपके द्वारा दी गई किसी भी सलाह के लिए अग्रिम धन्यवाद!

+0

ASP.NET * वेबफ़ॉर्म * या * MVC * अपने सी # अनुप्रयोग है? –

+0

उपयोगकर्ता जो प्रमाणीकरण के लिए उपयोग करते हैं वह एक सी # .Net 3.5 वेब अनुप्रयोग है। –

उत्तर

6

क्या आप जानते हैं? केबी आलेख पू है। यहाँ मेरी आधिकारिक सिफारिश है:

public void StreamFile(string filePath) 
{ 
    string fileName = Path.GetFileName(filePath); 

    using (var fStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
    { 
     var contentLength = fStream.Length; 

     if (Request.UserAgent.Contains("MSIE")) 
     { 
      Response.AddHeader("Content-Transfer-Encoding", "binary"); 
     } 

     Response.ContentType = "application/octet-stream"; 
     Response.AddHeader("Content-Length", contentLength.ToString()); 

     // Even though "Content-Disposition" should have an upper-case "d", as per http://www.ietf.org/rfc/rfc2183.txt 
     // IE fails to recognize this if the "d" is upper-cased. 
     Response.AddHeader("Content-disposition", "attachment; filename=" + fileName); 

     var buffer = new byte[8192]; 

     while (Response.IsClientConnected) 
     { 
      var count = fStream.Read(buffer, 0, buffer.Length); 
      if (count == 0) 
      { 
       break; 
      } 

      Response.OutputStream.Write(buffer, 0, count); 
      Response.Flush(); 
     } 
    } 

    Response.Close(); 
} 
+0

यह प्रयास करने के बाद, यह मुझे लगता है कि अभी भी फ़ाइल को स्मृति में लोड करता है। कम से कम, जब मैं 1.5 जीबी फ़ाइल पर कोशिश करता था, तो मैं मेमोरी अपवादों से बाहर निकल रहा था, और 450 एमबी पर डाउनलोड के इंतजार के थक गया था। मैं इसे एक परीक्षण मशीन पर कर रहा हूं, फाइल सर्वर नहीं, इसलिए मुझे जिस मेमोरी के साथ काम करना है वह कम है। मेरे फाइल सर्वर में रैम का एक टन है (24 जीबी मुझे लगता है) लेकिन मुझे एक समाधान चाहिए जो प्रोसेसर या मेमोरी पर बहुत अधिक तनाव की आवश्यकता नहीं है। Lighttpd यह mod_secdownload और यूआरएल रीराइट नियमों का उपयोग करता है, जो चक्र/स्मृति पर तेज़ और सस्ता है। –

+0

@john - जिस तरह से मैंने प्रतिबिंबक में कोड पढ़ा है, फाइलों को लिखने के लिए एमएस विधियों में से कोई भी वास्तव में छोटे बफर का उपयोग नहीं करता है। वे सभी पूरी फाइल के लिए एक बफर आवंटित प्रतीत होते हैं। इनमें से कुछ का पता लगाने में काफी मुश्किल है, इसलिए शायद मुझे कुछ याद आ रहा है। – Ray

+1

@ शिप स्लैपर: http://support.microsoft.com/kb/812406 – user7116

0

आप Microsoft की पृष्ठभूमि बुद्धिमत्तापूर्ण स्थानांतरण सेवा (BITS) में रुचि हो सकती।

http://msdn.microsoft.com/en-us/library/bb968799%28VS.85%29.aspx

संस्करण 2.5 प्रमाण पत्र के माध्यम से HTTP प्रमाणीकरण की शुरुआत की।

1

This thread में उपयोगकर्ताओं को फ़ाइलों को डाउनलोड करने के दौरान स्मृति उपयोग को कम रखने का मेरा समाधान है। हालांकि, शायद आप मेरे नमूना उपयोगों की तुलना में एक बड़ा बफर चाहते हैं।

+0

उपरोक्त उत्तर में उस धागे और माइक्रोसॉफ्ट समर्थन आलेख को पढ़ने के बाद, मैं उस दिशा में एक अस्थायी समाधान के लिए नेतृत्व कर रहा हूं। यह बेहतर है कि प्रक्रिया में कम एप्लिकेशन शामिल हैं, लेकिन यह क्या हो रहा है में पारदर्शी नहीं है। अब मुझे इसे लागू करने के लिए एक छोटा ऐप विकसित करना है और mod_secdownload का अपना संस्करण बनाना है क्योंकि मेरे उपयोगकर्ताओं को मान्य करने वाले ऐप फ़ाइल सर्वर पर नहीं है! जानकारी के लिए धन्यवाद! –

0

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

FILESTREAM Storage in SQL Server 2008