2015-08-18 6 views
5

से धारा देरी मैं एक MVC कार्रवाई जो वर्तमान में एक पीडीएफ देता है:वापसी MVC

return File(File.OpenRead(pdfPath), "application/pdf"); 

यह एक सरलीकरण है। अगर फ़ाइल मौजूद है तो हम सीधे ओपनरेड पर जाते हैं लेकिन अन्य मामलों में इसे पहले पुनर्प्राप्त या उत्पन्न किया जाना चाहिए। यह वह हिस्सा है जो क्लाइंट के HTTP प्रतिक्रिया के लिए प्रतीक्षा करने में पर्याप्त देरी कर सकता है।

मुझे आश्चर्य है कि एमवीसी के साथ तुरंत स्ट्रीम वापस करने का कोई तरीका है, लेकिन फ़ाइल उपलब्ध होने के बाद ही इसे लिखना शुरू करें।

इस तरह पीडीएफ क्लाइंट (में निर्मित क्रोम) लोडिंग स्पिनर को शुरुआत से दिखाएंगे और न कि स्ट्रीम सक्रिय रूप से ट्रांसफर हो रहा है।

उत्तर

2

मुझे नहीं लगता कि कम से कम एमवीसी मॉडल के भीतर स्ट्रीम को वापस करना संभव है, लेकिन कम से कम हेडर लौटा सकता है ताकि क्लाइंट कुछ आने वाला जानता हो। यहां एक उदाहरण दिया गया है:

public void SO32070323() 
{ 
    var file = new FileInfo(@"J:\Projects\XibisAutoGenTests\IansAwesomeSite\private\test.pdf"); 

    Response.AddHeader("Content-Disposition", "inline;filename=somefile.pdf"); 
    Response.AddHeader("Content-Length", file.Length.ToString()); 
    Response.Flush(); 
    Thread.Sleep(5000); 

    Response.TransmitFile(file.FullName); 

} 

इस तरह आप सामग्री की लंबाई और स्वभाव भेजते हैं ताकि क्लाइंट को पता चल सके कि फ़ाइल आ रही है। फिर आप बाद में वास्तविक फ़ाइल सामग्री भेज सकते हैं।

कृपया ध्यान दें कि अधिकतर ग्राहकों के पास टाइमआउट होने की संभावना है, इसलिए आप सामग्री भेजने से पहले हमेशा इंतजार नहीं कर सकते। टाइमआउट प्रति क्लाइंट भिन्न होने की संभावना है, लेकिन मुझे उम्मीद है कि अगर आप 30 सेकंड के भीतर सामग्री भेज सकते हैं तो आप ठीक होंगे।

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