2009-01-16 12 views
10

एएसपी.Net एप्लिकेशन में, मुझे उपयोगकर्ता इनपुट के जवाब में बाहरी सर्वर पर http POST के माध्यम से कुछ डेटा (urlEncodedUserInput) भेजने की आवश्यकता है पृष्ठ प्रतिक्रिया को पकड़ने के बिना। इससे कोई फर्क नहीं पड़ता कि दूसरे सर्वर से प्रतिक्रिया क्या है, और मुझे कोई परवाह नहीं है कि अनुरोध कभी-कभी विफल रहता है या नहीं। ऐसा लगता है कि यह ठीक काम कर रहा है (नीचे देखें) लेकिन मुझे चिंता है कि यह पृष्ठभूमि में संसाधनों को जोड़ रहा है जो प्रतिक्रिया के लिए इंतजार कर रहा है जिसका कभी भी उपयोग नहीं किया जाएगा।प्रतिक्रिया के इंतजार किए बिना एएसपीनेट में http अनुरोध कैसे भेजें और संसाधनों को टाई किए बिना

httpRequest = WebRequest.Create(externalServerUrl); 

httpRequest.Method = "POST"; 
httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; 

bytedata = Encoding.UTF8.GetBytes(urlEncodedUserInput); 
httpRequest.ContentLength = bytedata.Length; 

requestStream = httpRequest.GetRequestStream(); 
requestStream.Write(bytedata, 0, bytedata.Length); 
requestStream.Close(); 

सुंदर मानक सामान इस नहीं करता है, लेकिन आमतौर पर इस बिंदु पर आप httpRequest.getResponse() या httpRequest.beginGetResponse() फोन करता है, तो आप एसिंक्रोनस रूप से प्रतिक्रिया प्राप्त करना चाहता था होगा, लेकिन:

कोड यह मेरे परिदृश्य में जरूरी प्रतीत नहीं होता है।

क्या मैं सही काम कर रहा हूं? क्या मुझे httpRequest.Abort() को साफ़ करने के लिए कॉल करना चाहिए या यह अनुरोध को धीमे कनेक्शन पर भेजने से रोक सकता है?

उत्तर

7

मुझे लगता है कि Threadpool.QueueUserWorkItem वह है जिसे आप ढूंढ रहे हैं। lambdas और अनाम प्रकार के अलावा के साथ, यह वास्तव में आसान हो सकता है:

var request = new { url = externalServerUrl, input = urlEncodedUserInput }; 
ThreadPool.QueueUserWorkItem(
    (data) => 
    { 
     httpRequest = WebRequest.Create(data.url); 

     httpRequest.Method = "POST"; 
     httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; 

     bytedata = Encoding.UTF8.GetBytes(data.input); 
     httpRequest.ContentLength = bytedata.Length; 

     requestStream = httpRequest.GetRequestStream(); 
     requestStream.Write(bytedata, 0, bytedata.Length); 
     requestStream.Close(); 
     //and so on 
    }, request); 
0

एक ही रास्ता मैं की है कि आप अन्य अनुरोध से एक त्वरित प्रतिक्रिया मिल जाएगा सोच सकते हैं पेज पर आप पोस्ट कर रहे हैं करने के लिए है ThreadPool.QueueUserWorkItem का उपयोग करके एक धागा खोलें ताकि मुख्य धागा समय लेने वाले काम पूरा होने से पहले प्रतिक्रिया समाप्त कर सके। आपको पता होना चाहिए कि एक बार जब मुख्य थ्रेड निकलता है तो आपको HttpContext तक पहुंच नहीं होगी जिसका मतलब है कि कोई कैशिंग, सर्वर चर, इत्यादि ... साझा किए गए ड्राइव तब तक काम नहीं करेंगे जब तक कि आप नए थ्रेड में अनुमति वाले उपयोगकर्ता का प्रतिरूपण न करें। धागे अच्छे हैं, लेकिन देखने के लिए बहुत सी चीजें हैं।

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

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