2016-04-18 5 views
8

मैंने कोड को थोड़ा सा सरल बना दिया है लेकिन मूल रूप से यह मुझे "एक डिस्पोजेड ऑब्जेक्ट तक नहीं पहुंच सकता है।" त्रुटि और मैं काम नहीं कर सकता क्यों?यह एचटीपी क्लाइंट उपयोग क्यों मुझे "एक डिस्पोजेड ऑब्जेक्ट तक नहीं पहुंच सकता है।" त्रुटि?

मेरे पास एक साथ चलने वाले कई कार्य हैं जो एक जीईटी करते हैं तो कुछ एचटीएमएल का विश्लेषण करते हैं और फिर जीईटी के परिणामों के आधार पर एक पोस्ट करते हैं।

यह कोड परिणाम के साथ एक ईवेंट ऑब्जेक्ट रिटर्न में रहता है, इसलिए मुझे नहीं लगता कि मैं प्रतीक्षा कर सकता हूं क्योंकि विधि को शून्य वापस करने की आवश्यकता होगी?

loginHTMl = loginPostResult.Content.ReadAsStringAsync()। परिणाम लाइन है कि त्रुटि पैदा करता

foreach (Account accountToCheck in eventToCheck.accountsToRunOn) 
{ 
    Task.Run(() => 
    { 
     HttpClientHandler handler = new HttpClientHandler(); 
     CookieContainer cookies = new CookieContainer(); 
     handler.CookieContainer = cookies; 
     using (var client = new HttpClient(handler)) 
     { 
      ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; 
      client.Timeout = new TimeSpan(0, 0, 3); 
      client.DefaultRequestHeaders.Add("Keep-Alive", "false"); 
      HttpResponseMessage response = client.GetAsync("https://test.com", HttpCompletionOption.ResponseContentRead).Result; 
      string html = response.Content.ReadAsStringAsync().Result; 

      var content = new FormUrlEncodedContent(new[] 
      { 
       new KeyValuePair<string, string>("test[username_or_email]", accountToLogIn.accountHandle), 
       new KeyValuePair<string, string>("test[password]",   accountToLogIn.accountPassword) 
      }); 

      var loginPostResult = client.PostAsync("https://test.com/login", content).Result; 

      loginHTMl = convertToUTF8(loginPostResult.Content.ReadAsStringAsync().Result); 
     } 
    }); 
} 

StackTrace है।

System.IO.IOException occurred 
    HResult=-2146232800 
    Message=Unable to read data from the transport connection: Cannot access a disposed object. 
Object name: 'System.Net.Sockets.Socket'.. 
    Source=System 
    StackTrace: 
     at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult) 
    InnerException: 
     HResult=-2146232798 
     Message=Cannot access a disposed object. 
Object name: 'System.Net.Sockets.Socket'. 
     ObjectName=System.Net.Sockets.Socket 
     Source=System 
     StackTrace: 
      at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult, SocketError& errorCode) 
      at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) 
      at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult) 
     InnerException: 
+0

कौन सी लाइन आपको अपवाद दे रही है? अपने प्रश्न में पूरे स्टैक ट्रेस पोस्ट करें। – CathalMF

+0

क्या आप देख रहे अपवाद के वास्तविक स्टैक ट्रेस पोस्ट कर सकते हैं। – CathalMF

+0

मैंने सवाल संपादित किया है, उम्मीद है कि थोड़ा सा मदद करता है, मुझे बताएं कि मैं और क्या जोड़ सकता हूं :-) – jamie

उत्तर

16

कुछ शोध के ठीक बाद मुझे समस्या मिली। पहले अनुरोध के बाद HttpClientHandler का निपटान किया जाएगा। आपको अपने सिस्टम को हैंडलर का निपटान न करने का निर्देश देना होगा।

कन्स्ट्रक्टर को false जोड़ने के लिए अपना उपयोग बदलें।

using (var client = new HttpClient(handler, false)) 
{ 

} 
+0

अजीब, मैंने इसे सेट किया लेकिन यह कोई फर्क नहीं पड़ता – willem

3

निपटान को रोकने के लिए एचटीपी क्लाइंट हैंडलर उदाहरण का पुन: उपयोग करना एक अच्छा अभ्यास है।

व्यक्तिगत रूप से मैं कार्य को कम करने के साथ अधिक स्पष्ट वाक्यविन्यास पसंद करता हूं। परिणाम कॉल।

// single setup of client handler 
HttpClientHandler handler = new HttpClientHandler(); 

var tasks = eventToCheck.accountsToRunOn.Select(async() => { 
    // ... 
    using (var client = new HttpClient(handler, false)) // pass false to prevent Disposing 
    { 
     // ... 
     var html = await response.Content.ReadAsStringAsync(); 
     // ... 
     return loginHtml; 
    } 
}); 

// get array of results 
string[] loginsHtml = await Task.WhenAll(tasks); 
संबंधित मुद्दे