2010-04-02 11 views
23

पर लिखने के बारे में कुछ प्रश्न मैं एएसपी.NET HttpHandler के साथ परीक्षण स्ट्रीम पर सीधे लिखने वाली फ़ाइल डाउनलोड करने के लिए परीक्षण कर रहा हूं, और मुझे यह सुनिश्चित नहीं है कि मैं इसे कैसे कर रहा हूं। यह एक उदाहरण विधि, भविष्य में फ़ाइल डेटाबेस में एक बूँद में संग्रहित किया जा सकता है:एएसपी.NET प्रतिक्रिया धारा

 public void GetFile(HttpResponse response) 
    { 
     String fileName = "example.iso"; 
     response.ClearHeaders(); 
     response.ClearContent(); 
     response.ContentType = "application/octet-stream"; 
     response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName); 
     using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open)) 
     { 
      Byte[] buffer = new Byte[4096]; 
      Int32 readed = 0; 

      while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       response.OutputStream.Write(buffer, 0, readed); 
       response.Flush(); 
      } 
     } 
    } 

लेकिन, अगर यह सही है या वहाँ यह करने के लिए एक बेहतर तरीका है मैं यकीन नहीं है। मेरे प्रश्न हैं:

  1. जब मैं ब्राउज़र के साथ यूआरएल खोलते हैं, तो प्रतीत होता है "Save File" संवाद ... लेकिन ऐसा लगता है सर्वर पहले से ही शुरू कर दिया है की तरह धारा में डेटा पुश करने के लिए इससे पहले कि मैं क्लिक करें "सहेजें ", क्या यह सामान्य है?
  2. यदि मैं ब्राउज़र के साथ यूआरएल खोलता हूं, तो मैं "प्रतिक्रिया.फ्लश()" रेखा को हटा देता हूं, ... मैं देखता हूं कि वेब सर्वर डेटा को कैसे दबा रहा है लेकिन "फ़ाइल सहेजें" संवाद नहीं आया है, (या कम से कम उचित समय में नहीं) क्यों?
  3. जब मैं WebRequest ऑब्जेक्ट के साथ यूआरएल खोलता हूं, तो मुझे लगता है कि HttpResponse.ContentLength "-1" है, हालांकि मैं स्ट्रीम पढ़ सकता हूं और फ़ाइल प्राप्त कर सकता हूं। -1 का अर्थ क्या है? HttpResponse.ContentLength कब प्रतिक्रिया की लंबाई दिखाने जा रहा है? उदाहरण के लिए, मेरे पास एक विधि है जो एक बाइनरी स्ट्रीम के रूप में डिफ्लेट के साथ मिश्रित एक बड़ा एक्सएमएल पुनर्प्राप्त करता है, लेकिन उस स्थिति में ... जब मैं इसे WebRequest के साथ एक्सेस करता हूं, तो HttpResponse में मैं वास्तव में स्ट्रीम की लंबाई के साथ ContentLength देख सकता हूं , क्यूं कर?
  4. बाइट [] सरणी के लिए इष्टतम लंबाई क्या है जिसे मैं वेब सर्वर में इष्टतम प्रदर्शन के लिए बफर के रूप में उपयोग करता हूं? मैंने पढ़ा है कि 4 के और 8 के बीच है ... लेकिन सही निर्णय लेने के लिए मुझे किन कारकों पर विचार करना चाहिए।
  5. क्या यह विधि आईआईएस या क्लाइंट मेमोरी उपयोग को फूटती है? या यह वास्तव में स्थानांतरण को सही ढंग से बफर कर रहा है?

इतने सारे सवालों के लिए खेद है, मैं बहुत वेब विकास में नए कर रहा हूँ: पी

चीयर्स।

+1

आपको यहां Boilerplate HttpHandler कार्यान्वयन को भी देखना चाहिए (http://haacked.com/archive/2005/03/17/AnAbstractBoilerplateHttpHandler.aspx) और यहां (http://www.hanselman.com /blog/PermaLink,guid,5c59d662-b250-4eb2-96e4-f274295bd52e.aspx)। – R0MANARMY

+0

सीखने का आपका तरीका सराहना की है। बढ़ा चल । –

+0

यह काम करेगा: [http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet][1] [ 1]: http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet –

उत्तर

16
  1. हां; यह सामान्य बात है।
  2. यदि आप कभी भी फ्लश नहीं करते हैं, तो ब्राउज़र को सीवर खत्म होने तक कोई प्रतिक्रिया नहीं मिलती है (यहां तक ​​कि Content-Disposition शीर्षलेख भी नहीं)। इसलिए, यह एक फ़ाइल संवाद दिखाने के लिए नहीं जानता है।
  3. Content-Length हेडर केवल तभी सेट हो जाता है जब पूरी प्रतिक्रिया बफर्ड हो (यदि आप कभी फ्लश नहीं करते) या यदि आप इसे स्वयं सेट करते हैं। इस मामले में, आप इसे स्वयं सेट कर सकते हैं;

    response.AppendHeader("Content-Length", new FileInfo(path).Length.ToString()); 
    
  4. मैं 4K की अनुशंसा करता हूं; मुझे सिफारिश के लिए कोई कठिन आधार नहीं है।
  5. यह विधि इसे करने का सबसे अच्छा तरीका है। लूप के अंदर Flush पर कॉल करके, आप बिना किसी बफरिंग के तुरंत तार को प्रतिक्रिया भेज रहे हैं। हालांकि, अतिरिक्त प्रदर्शन के लिए, आप जीजेआईपी संपीड़न का उपयोग कर सकते हैं।
+0

धन्यवाद सब, आप मेरे सभी संदेहों को साफ़ करते हैं। मुझे खुशी है कि मैं इस समुदाय में शामिल हो गया: डी – vtortola

2
  1. हां, यह बफरिंग है।
  2. फ्लश ब्राउज़र में कैश की गई सामग्री को धक्का देता है। यदि इसे कभी धक्का नहीं दिया जाता है, तो आपको एक सेव डायलॉग बॉक्स नहीं मिलेगा।
  3. आपके द्वारा उपयोग की जा रही सटीक फ़ाइलों/यूआरएल/स्ट्रीम को देखे बिना बताना मुश्किल है।
  4. मुझे लगता है कि कारक इस बात पर निर्भर करते हैं कि आपका पृष्ठ कितना सुस्त है, वास्तव में। आप 4k की ओर बेहतर प्रदर्शन करेंगे। और शायद, धीमी कनेक्शन धीमी कनेक्शन को समायोजित करने के लिए बेहतर होगा।
  5. # 1 & 2.
+0

धन्यवाद सब, आप मेरे सभी संदेहों को साफ़ करते हैं। मुझे खुशी है कि मैं इस समुदाय में शामिल हुआ: डी – vtortola

2

# 3 के लिए आप अपने http-उत्तर में सामग्री-लंबाई हैडर निर्धारित करने की आवश्यकता देखें। उनमें से कई मूल्य http शीर्षलेख से आते हैं।

मेरा मानना ​​है कि आप प्रतिक्रिया वस्तु पर झूठी संपत्ति को बदलकर बफरिंग को बदल सकते हैं। थोड़ी देर में ऐसा नहीं किया है, इसलिए मुझे याद नहीं है कि यह क्या हो सकता है।

+0

धन्यवाद सब, आप मेरे सभी संदेहों को साफ़ करते हैं। मुझे खुशी है कि मैं इस समुदाय में शामिल हुआ: डी – vtortola