2010-07-09 11 views
6

मैं दूरस्थ सर्वर पर सेवा जैसी बाकी सेवा का उपयोग करने के लिए httpwebrequest का उपयोग करने की कोशिश कर रहा था और पहले निष्पादन से ही, मेरा कोड प्रोग्राम लटक रहा था। फिर मैंने यह सुनिश्चित करने के लिए एक कंसोल एप्लिकेशन के रूप में कोशिश की कि इसका प्रोग्राम के साथ कुछ लेना देना नहीं है लेकिन कोई किस्मत नहीं!सी # httpwebrequest getResponse() फ्रीज और मेरे प्रोग्राम को लटकता है

 string credentialsJson = @"{""username"":""test"", 
             ""password"":""test"" 
            }"; 

     int tmp = ServicePointManager.DefaultConnectionLimit; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://qrua.com/qr/service" + @"/auth/login"); 
     request.Method = "POST"; 
     request.KeepAlive = true; 
     request.Timeout = 50000 ; 
     request.CookieContainer = new CookieContainer(); 
     request.ContentType = "application/json"; 
     try 
     { 
      StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
      writer.Write(credentialsJson); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("EXCEPTION:" + e.Message); 
     } 

     //WebResponse response = request.GetResponse(); 
     try 
     { 
      using (WebResponse response = (HttpWebResponse)request.GetResponse()) 
      { 
       Console.WriteLine("request:\n" + request.ToString() + "\nresponse:\n" + response.ContentLength); 
       response.Close(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("EXCEPTION: in sending http request:" + " \nError message:" + e.Message); 
     } 

विभिन्न मंचों से कई चीजों की कोशिश की लेकिन इससे मदद नहीं मिलती है। उपर्युक्त कोड के साथ भी एक सरल कंसोल ऐप कंसोल को अनिश्चित काल तक लटका देता है! किसी भी मदद .. बहुत अच्छा होगा

धन्यवाद

+0

request.ContentLength निर्दिष्ट करने का प्रयास करें:

 StreamWriter writer = new StreamWriter(request.GetRequestStream()); writer.Write(credentialsJson); 

कुछ इस तरह की कोशिश करो। देखें: http://stackoverflow.com/questions/6736056 –

उत्तर

10

तुम कभी StreamWriter बंद करने कर रहे हैं ... तो मैं यह प्लावित नहीं किया जा रहा है पर शक। माना जाता है कि मैं सिर्फ एक लटकने के बजाय सर्वर से एक त्रुटि की उम्मीद करता हूं, लेकिन यह देखने लायक है।

बीटीडब्ल्यू, आपको प्रतिक्रिया और को बंद करने की आवश्यकता नहीं है। बस using कथन पर्याप्त है।

+0

आपने इसे सही के रूप में क्यों चिह्नित किया, और फिर किसी अन्य स्थान पर आप कहते हैं, "लेखक को बंद करने की कोशिश की और उसने बहुत कुछ नहीं किया"? –

+0

@ लॉस्ट हॉबिट: मेरा सुझाव है कि आप मेरे उत्तर के बजाय * प्रश्न * पर एक टिप्पणी जोड़ें - ओपी को इस टिप्पणी की अधिसूचना नहीं मिलेगी। (ऐसा नहीं है कि ओपी 11 महीनों के लिए स्टैक ओवरफ़्लो पर है ...) –

+1

एचटीएमएलएगिलिटीपैक का उपयोग कर रहा था और उस लाइब्रेरी में स्थायी रीडायरेक्ट का पालन करने से पहले नया निर्माण करने से पहले अंतर्निहित प्रतिक्रिया बंद नहीं हुई थी। –

2

और भी बहुत कुछ आप अगर रिमोट सर्वर एक Timeout को परिभाषित करने के अलावा अन्य नहीं दे रहा है क्या करना है और के रूप में आप उपयोगकर्ता सूचित करना है कि आपरेशन क्योंकि दूरस्थ साइट कोई जवाब नहीं दिया पूरा नहीं कर सकते हैं में किया था अपवाद पकड़ कर सकते हैं नहीं है:

var request = (HttpWebRequest)WebRequest.Create("https://qrua.com/qr/service/auth/login"); 
request.Timeout = 5000; 
// If the server doesn't respond within 5 seconds you might catch the timeout exception 
using (var response = request.GetResponse()) 
{ 

} 

आप यूआई आप async संस्करण इस्तेमाल कर सकते हैं फ्रीज करने नहीं करना चाहते हैं: BeginGetResponse

0

request.ContentLength निर्दिष्ट करने का प्रयास।

करने से पहले

:

using (MemoryStream stream = new MemoryStream()) 
{ 
    using (var writer = StreamWriter writer = new StreamWriter(stream)) 
    { 
     writer.Write(credentialsJson); 
     writer.Close(); 
    } 
    request.ContentLength = stream.Length; 
} 
संबंधित मुद्दे