2016-07-22 5 views
10

हम एक समस्या हाल ही में जहां डेवलपर्स में से एक है जब एक पीडीएफ के पास निम्न की इसी तरह से डाउनलोड करने के लिए मजबूर कर रहा HttpApplication.CompleteRequest का उपयोग करने के HttpResponse.End का उपयोग करने से कोड की एक पंक्ति बदल गया था था: https://stackoverflow.com/a/8590579/3856039उपयोग PDF डाउनलोड

ऐसा करने से कुछ पीडीएफ गैर-ब्रेकिंग स्पेस इश्यू के कारण डाउनलोड करने में असफल हो जाते हैं, इसलिए कोड HttpResponse.End का उपयोग करने के लिए वापस बदल दिया गया था।

हालांकि, मेरे सहकर्मी मैं कुछ शोध को कर रहा था और मैं निम्नलिखित प्रश्न में आए मदद करने में: Is Response.End() considered harmful?

कौन से जोड़ता है: https://blogs.msdn.microsoft.com/aspnetue/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation/

को देखते हुए क्या MSDN ब्लॉग पोस्ट में दर्ज है, ऐसा लगता है कि HttpResponse.End का उपयोग गलत तरीका है, इसलिए मैं सोच रहा था कि यह भी आवश्यक है या कोई बेहतर दृष्टिकोण है या नहीं?

+0

यदि आपके पास अनुरोध को मैन्युअल रूप से समाप्त करने का कोई कारण है तो CompleteRequest उपयोग करने की बात है, अगर यह किसी और समस्या का कारण बन रही है तो आपको यह पता होना चाहिए कि आपको क्या पता होना चाहिए और ठीक करना चाहिए। प्रतिक्रिया लिखने के बाद यदि आपका एप्लिकेशन स्वाभाविक रूप से अपने प्रवेश बिंदु पर स्वाभाविक रूप से वापस आ जाता है तो आपको कुछ भी कॉल करने की आवश्यकता नहीं है। –

+0

क्या आपने फ़ाइल को बाइट सरणी के रूप में पढ़ने की कोशिश की है और इसे FileResult के रूप में वापस कर दिया है? यह आपके प्रश्न का जवाब नहीं देता है, लेकिन यह एक कामकाज हो सकता है। –

+0

मुझे लगता है कि आपके द्वारा शामिल एमएसडीएन लिंक में वह उत्तर है जिसे आप ढूंढ रहे हैं: "एंड विधि केवल तभी है क्योंकि हमने क्लासिक एएसपी के साथ संगत होने की कोशिश की थी जब 1.0 जारी किया गया था।" यह तब कहता है कि इसकी अनुशंसा नहीं की जाती है क्योंकि यह सामग्री को समकालिक रूप से फ़्लश करती है, जबकि अनुरोध सामान्य तरीके से समाप्त होने पर डेटा को असंकालिक रूप से भेजा जाता है। "अंत के लिए प्रलेखन में यह कहना चाहिए कि FullRequest EndRequest अधिसूचना को आगे छोड़ने और अनुरोध को पूरा करने का एक बेहतर तरीका है।" –

उत्तर

0

यहाँ दृष्टिकोण मैं पिछले

// Sends all currently buffered output 
HttpContext.Current.Response.Flush(); to the client. 

// Gets or sets a value indicating whether to send HTTP content to the client. 
HttpContext.Current.Response.SuppressContent = true; 

/* Causes ASP.NET to bypass all events and filtering in the HTTP pipeline 
    chain of execution and directly execute the EndRequest event. */ 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 
1

में प्रयोग किया जाता है यहाँ Response.End से वास्तविक कोड है:

public void End() 
{ 
    if (this._context.IsInCancellablePeriod) 
    { 
     HttpResponse.AbortCurrentThread(); 
     return; 
    } 
    this._endRequiresObservation = true; 
    if (!this._flushing) 
    { 
     this.Flush(); 
     this._ended = true; 
     if (this._context.ApplicationInstance != null) 
     { 
      this._context.ApplicationInstance.CompleteRequest(); 
     } 
    } 
} 

ThreadAbortException flow-- के नियंत्रण के लिए प्रयोग किया जाता है मूल रूप से करने के लिए आप की अनुमति देता है return के स्थान पर Response.End का उपयोग करें। लेकिन अगर आपने अपने हैंडलर को अच्छी तरह डिज़ाइन किया है, तो आपको इसकी आवश्यकता नहीं हो सकती है, उदा। अगर Response.End() के बाद कोई कोड नहीं है। आमतौर पर अपवाद फेंकना बेहतर नहीं है अगर आप इससे बच सकते हैं, क्योंकि यह (सभी अपवादों की तरह) एक ढेर को खोलने और कुछ प्रदर्शन ओवरहेड का कारण बनता है।

शायद आप Response.End का अपना संस्करण लिख सकते हैं और चुन सकते हैं और वास्तव में कोड की कौन सी पंक्तियां निष्पादित कर सकते हैं, उदाहरण के लिए चुनें। हो सकता है कि आप बफर को फ्लश करना चाहते हैं और CompleteRequest को कॉल करना चाहते हैं लेकिन आप अपवाद फेंकना नहीं चाहते हैं।

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