2010-07-10 10 views
5

मैं एक वेब अनुप्रयोग विकसित करने के लिए ASP.Net + .NET 3.5 + VSTS 2008 + IIS 7.0 + C# का उपयोग कर रहा हूं। मुझे लगता है कि VSTS 2008 में डिबगिंग करते समय, अगर मैं पेज_लोड में Response.Close() विधि को कॉल करता हूं (कृपया नीचे दिए गए कोड का संदर्भ लें), त्रुटि होगी (पृष्ठ तक पहुंचने पर IE से) जैसे सर्वर से कनेक्ट नहीं हो सकता है।एएसपी.Net प्रतिक्रिया। समस्या

मेरा प्रश्न है,

  1. आम तौर पर जब हम Response.Close() बुलाना चाहिए? या कॉल करने की कोई ज़रूरत नहीं है (स्वचालित रूप से बंद करने के लिए एएसपी.Net ढांचे पर भरोसा करें)?

Btw: मेरे पिछले समझ डेवलपर हमेशा Response.Close बुलाना चाहिए जब प्रसंस्करण सर्वर साइड पर पूरा हो गया है और सभी डेटा Response.Write का उपयोग कर ग्राहक के लिए लिखा गया है है। क्या मैं सही हूँ?

2 मैं अपने कोड में ऐसी त्रुटि से क्यों मिला? मूल कारण क्या है?

 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.Write("Hello World! "); 
     Response.Close(); 
    } 

उत्तर

9

MSDN website से निम्न यहाँ उपयोगी हो सकता है:

इस विधि अचानक ढंग से ग्राहक के लिए कनेक्शन समाप्त हो जाता है और सामान्य HTTP अनुरोध प्रसंस्करण के लिए इरादा नहीं है। विधि क्लाइंट को एक रीसेट पैकेट भेजती है, जो सर्वर, क्लाइंट, या कहीं भी गिराए जाने के बीच कहीं भी प्रतिक्रिया डेटा का कारण बन सकती है।

आप दुर्भावनापूर्ण HTTP क्लाइंट द्वारा किसी हमले के जवाब में इस विधि का उपयोग कर सकते हैं।हालांकि, अगर आप EndRequest ईवेंट पर आगे बढ़ना चाहते हैं और क्लाइंट को प्रतिक्रिया भेजना चाहते हैं तो आम तौर पर आपको CompleteRequest को कॉल करना चाहिए।

+0

क्या आप किसी भी परिस्थिति में मतलब रखते हैं, हमें Response.Close को कॉल करने की आवश्यकता नहीं है? यदि हां, तो एएसपी.Net इस तरह की एक विधि का पर्दाफाश क्यों करता है? – George2

+2

"आप किसी दुर्भावनापूर्ण HTTP क्लाइंट द्वारा हमले के जवाब में इस विधि का उपयोग कर सकते हैं।" –

+1

निश्चित रूप से सामान्य उपयोग में नहीं। संभावित उपयोग के लिए एमएसडीएन से दूसरा पैराग्राफ देखें। – Andy

1

मेरे अनुभव में आपके द्वारा दिए गए कोड उदाहरण के भीतर Response.Close(); कॉल करने के लिए, बस इसे हटाने का कोई कारण नहीं है।

पृष्ठों में पृष्ठ पृष्ठ लोड होने के बाद जीवन चक्र में, कई अन्य विधियां हैं जिन्हें आपके लिए आपके जवाब बंद कर दिए जाएंगे। - जो है, और कुछ नहीं सब पर ग्राहक को भेजे जाने की आवश्यकता

आप Response.Close() बुलाना चाहिए जब कनेक्शन समाप्त करने के लिए अपनी जरूरत:

Read here for the Page Lifecycle

+0

आप सभी स्थितियों में मतलब है, Response.Close को कॉल करने की आवश्यकता नहीं है? यदि हां, तो एएसपी.Net इस तरह की एक विधि का पर्दाफाश क्यों करता है? – George2

+0

अगर Response.Close() को कॉल न करें, क्लाइंट अनुरोध कैसे बताना है और सभी प्रतिक्रियाएं उत्पन्न की गई हैं? आईई को ऐसी जानकारी की आवश्यकता नहीं है? – George2

+1

मैं इस कथन को अपने कोड उदाहरण –

1

प्रश्न 1 उत्तर देने के लिए। इसमें आपके द्वारा पोस्ट की गई कोई भी चीज़ शामिल नहीं है, क्योंकि पृष्ठ के शेष को संसाधित और क्लाइंट को भेजा जाना आवश्यक है। आम तौर पर आप उस डेटा को लौटते समय कॉल करेंगे जो एएसपीएक्स पेज से एक पृष्ठ नहीं है (उदाहरण के लिए एक पीडीएफ फाइल, एक छवि इत्यादि ...)।

प्रश्न 2 उत्तर देने के लिए:

आप अपने Page_Load ईवेंट हैंडलर में Response.Close() नहीं बुलाना चाहिए - यह है कि page lifecycle के बाकी ठीक से नहीं चलेगा मतलब होगा।

MSDN (HttpResponse.Close method) से:

इस विधि अचानक ढंग से ग्राहक के लिए कनेक्शन समाप्त हो जाता है और सामान्य HTTP अनुरोध प्रसंस्करण के लिए इरादा नहीं है। विधि क्लाइंट को एक रीसेट पैकेट भेजती है, जो सर्वर, क्लाइंट, या कहीं भी गिराए जाने के बीच कहीं भी प्रतिक्रिया डेटा का कारण बन सकती है।

+0

क्या आप किसी भी परिस्थिति में मतलब रखते हैं, हमें Response.Close को कॉल करने की आवश्यकता नहीं है? यदि हां, तो एएसपी.Net इस तरह की एक विधि का पर्दाफाश क्यों करता है? – George2

+1

@ जॉर्ज 2 - ज्यादातर स्थितियों में आपको इसका उपयोग करने की आवश्यकता नहीं है। यह दुर्लभ स्थितियों के लिए है जहां आपको इसकी आवश्यकता है। – Oded

+0

धन्यवाद ओडेड! मुझे लगता है कि हमें आपके द्वारा वर्णित जीवन चक्र दस्तावेज़ के लिंक में दस्तावेज किए गए सभी चरण/ईवेंट हैंडलर को लागू करने की आवश्यकता है, और एएसपी.Net अंतर्निहित ढांचा हमारे लिए स्वचालित रूप से कनेक्शन बंद कर देगा, सही? मेरा पिछला भ्रम यह है कि अगर हम प्रतिक्रिया बंद नहीं करते हैं, तो क्या कोई लीक है? – George2

1

.NET एक बहुत ही लचीला नेटवर्क है जो आपको .NET से पहले कुछ भी करने देगा। (और अधिक स्पष्ट रूप से)। लेकिन सबसे बढ़िया बात यह है कि .NET बहुत सावधानी बरतता है, यह आपके लिए ख्याल रख सकता है।

इसका मतलब है कि यदि आप वेब पेज बनाते हैं और खाली करते हैं और इसे अपने ब्राउज़र में चलाते हैं तो आपको इसे काम करने के लिए कुछ और करने की ज़रूरत नहीं है।

कभी कभी हालांकि आप अपने आप को एक स्थिति है जहाँ आप कुछ असाधारण क्या करने की जरूरत में मिल सकता है और आप की तरह Reponse.Close()

आपके मामले में तो कोई आप ऐसी बात नहीं कर रहे हैं कार्यों के अस्तित्व के लिए thankfull जाएगा किसी विशेष समारोह कॉलिंग की आवश्यकता है।

इसके अलावा Response.Write() वह है जो हम दिनों में वापस उपयोग करते थे ... क्या आप अभी भी क्लासिक एएसपी मोड में सोच रहे हैं?

सुझाव: Response.Write()

का उपयोग लेकिन अपने वेब पेज और उपयोग में एक लेबल न रखें:

this.Label1.Text = "Hello world"; 

addtional टिप्पणी:

विशेष रूप से ASP.Net के प्रयोजन किसी ब्राउज़र पर वेब पेज भेजना, किसी भी पोस्ट किए गए डेटा को एकत्र करना, इसे संसाधित करना, सर्वर ओएस के साथ बातचीत करना आदि।

तो हो सकता है कि आप मेरी राय में, मान लें कि कुछ देखभाल पृष्ठ में तेजी से की जा रही है और 2) यह सुनिश्चित करना कि उपयोगकर्ता प्रोग्राम करने के तरीके पर गाइड लाइनों का पालन करते समय कुछ भी गलत नहीं होता है। नेट वेब पेज।

सभी पेज ईवेंट हैंडलर को लागू करने की कोई आवश्यकता नहीं है। ढांचे को समझें, समझें कि प्रत्येक पृष्ठ की घटना क्या करती है और जानें कि कौन सी घटना को कार्यान्वित करना है।

यदि आप केवल डेटाबेस से डेटा दिखाने जा रहे हैं तो आपको ईवेंट हैंडलर की भी आवश्यकता नहीं है। डेटा नियंत्रण (डेटा स्रोत, ग्रिड व्यू, लिस्ट व्यू, रिपेटर इत्यादि) के बारे में पढ़ें।

मान लें कि यदि आप कुछ नहीं करते हैं, तो फ्रेमवर्क आपके लिए यह करेगा। (यदि आप कुछ भी नहीं करते हैं, तो कुछ नहीं होता है, यह डिज़ाइन द्वारा होता है)

चीयर्स।

+0

धन्यवाद जेरोन! मुझे लगता है कि हमें जीवन चक्र दस्तावेज (http://msdn.microsoft.com/en-us/library/ms178472.aspx) के लिंक में दस्तावेज किए गए सभी चरण/ईवेंट हैंडलर को लागू करने की आवश्यकता है, और एएसपी.Net अंतर्निहित ढांचा होगा हमारे लिए स्वचालित रूप से बंद कनेक्शन, सही? मेरा पिछला भ्रम है (1) अगर हम प्रतिक्रिया बंद नहीं करते हैं, तो क्या कोई लीक है? (2) अगर हम बंद नहीं करते हैं, तो प्रतिक्रिया डेटा सर्वर पर buffered किया जा सकता है और समय पर फैशन ब्राउज़र में तुरंत क्लाइंट ब्राउज़र को नहीं भेज सकता है। कोई टिप्पणी? – George2

+1

मेरा संपादन पढ़ें ... – Jeroen

+0

धन्यवाद जेरिक! तो हमारे डेवलपर्स के लिए, हमें केवल सभी आवश्यक चरण/घटना हैंडलर को लागू करने की आवश्यकता है जो हमारे विशिष्ट अनुप्रयोग के लिए महत्वपूर्ण हैं, जैसा जीवन चक्र दस्तावेज़ (msdn.microsoft.com/en-us/library/ms178472.aspx) के लिंक में दस्तावेज किया गया है। , पेज_लोड विधि की तरह, और एएसपी.Net ढांचा हमारे लिए क्लाइंट को स्वचालित रूप से प्रतिक्रिया भेजना संभाल लेगा (इसका मतलब है कि हमें डेटा भेजने के लिए और अंतर्निहित HTTP कनेक्शन कब बंद करना है) को नियंत्रित करने की आवश्यकता नहीं है, सही? – George2

6

आपको सामान्यतः "सामान्य" एएसपी.NET प्रसंस्करण में Response.Close विधि का उपयोग नहीं करना चाहिए।

आपके सभी डेटा जो HttpResponse "स्ट्रीम" पर लिखे गए हैं, क्लाइंट ब्राउज़र पर भेजने से पहले buffered है। Response.Close विधि अचानक HTTP कनेक्शन को समाप्त कर देगी और आप उस डेटा को खो सकते हैं जिसे आपने पहले उत्तर दिया था। अनजाने में लिखा गया।

तुम सच में प्रोग्राम के रूप में "शक्ति" एक प्रतिक्रिया स्ट्रीम के अंत में, आप का उपयोग करना चाहिए या तो चाहते हैं: Response.Flush();Response.End();

Response.Flush विधि कॉल सुनिश्चित करता है के द्वारा पीछा किया कि सभी डेटा है कि आप प्रतिक्रिया स्ट्रीम के लिए लिखा हो सकता है क्लाइंट को "फ्लश" किया गया है, और Response.End सुनिश्चित करता है कि वर्तमान में सभी बफर किए गए डेटा को क्लाइंट को सही ढंग से भेजा गया है, और EndRequest ईवेंट भी बढ़ाता है, जिसे आप संभालना चाहते हैं।

आप HttpApplication's CompleteRequest() विधि का भी उपयोग कर सकते हैं।

MSDN documentation सबसे अच्छा में कहा गया है यह:

इस विधि अचानक ढंग से ग्राहक के लिए कनेक्शन समाप्त हो जाता है और सामान्य HTTP अनुरोध प्रक्रिया के लिए इरादा नहीं है। विधि क्लाइंट को रीसेट पैकेट भेजती है, जो सर्वर, क्लाइंट, या पर कहीं भी छोड़ने के बीच में प्रतिक्रिया डेटा का कारण बन सकता है जो को छोड़ देता है।

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

+0

धन्यवाद क्रेगटीपी! मुझे लगता है कि हमें जीवन चक्र दस्तावेज (http://msdn.microsoft.com/en-us/library/ms178472.aspx) के लिंक में दस्तावेज किए गए सभी चरण/ईवेंट हैंडलर को लागू करने की आवश्यकता है, और एएसपी.Net अंतर्निहित ढांचा होगा हमारे लिए स्वचालित रूप से बंद कनेक्शन, सही? मेरा पिछला भ्रम है (1) अगर हम प्रतिक्रिया बंद नहीं करते हैं, तो क्या कोई लीक है? (2) अगर हम बंद नहीं करते हैं, तो प्रतिक्रिया डेटा सर्वर पर buffered किया जा सकता है और समय पर फैशन ब्राउज़र में तुरंत क्लाइंट ब्राउज़र को नहीं भेज सकता है। कोई टिप्पणी? – George2

+0

@ जॉर्ज 2 - हां, एएसपी.नेट ढांचा आपके लिए एचटीपीआरएसपीएस के कनेक्शन को बंद कर देगा और यह सुनिश्चित करेगा कि ऐसा करने पर इसके सभी बफर "फ्लश" हो जाएं। बिल्कुल कोई रिसाव नहीं होना चाहिए। कनेक्शन को स्पष्ट रूप से बंद किए बिना (प्रतिक्रिया 'का उपयोग करके मैंने कई बार HttpResponse स्ट्रीम ('Response.Write' का उपयोग करके) डेटा को मैन्युअल रूप से लिखा है।एंड' या अन्य विधि कॉल) और अंतर्निहित एएसपी.नेट ढांचे ने हमेशा अपने बफर को सही तरीके से फ़्लश किया है और पूरी बफरर्ड प्रतिक्रिया स्ट्रीम को क्लाइंट ब्राउज़र में सही तरीके से भेजा है। – CraigTP