2015-03-31 18 views
5

मेरे पास एकाधिक एपीआई कॉल के साथ एक विंडोज यूनिवर्सल प्रोजेक्ट है। एक विधि घटनाओं को काम करने से इंकार कर देती है मेरी अन्य कॉल पूरी तरह से इस तरह काम करती हैं। मैंने using कीवर्ड की कोशिश की है कि यह इस मुद्दे को हल करेगा।ऑब्जेक्ट डिस्प्लेएक्सप्शन ऑन एचटीपी क्लाइंट

समारोह:

public async Task<User> GetNewUser(string user_guid, OAuthTokens OAuth) 
{ 
    String userguidJSON = VALIDJSON_BELIEVE_ME; 
    using (var httpClient = new HttpClient()) 
    { 
     httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", Encrypt(OAuth.Accesstoken)); 

     using (HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_USERS + "/data")) 
     { 
      req.Content = new StringContent(userguidJSON, Encoding.UTF8, "application/json"); 
      await httpClient.SendAsync(req).ContinueWith(respTask => 
      { 
       Debug.WriteLine(req.Content.ReadAsStringAsync()); //Error is thrown ono this line 
      }); 
      return null; 
     } 
    } 
} 

संपादित

public async Task<User> GetNewUser(string user_guid, OAuthTokens OAuth) 
{ 
    String userguidJSON = VALIDJSON_BELIEVE_ME; 
    using (var httpClient = new HttpClient()) 
    { 
     httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", Encrypt(OAuth.Accesstoken)); 

     using (HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_USERS + "/data")) 
     { 
      req.Content = new StringContent(userguidJSON, Encoding.UTF8, "application/json"); 
      await httpClient.SendAsync(req); 
      var result = await req.Content.ReadAsStringAsync(); //Cannot access a disposed object. Object name: 'System.Net.Http.StringContent'. 
      Debug.WriteLine(result); 
      return null; 
     } 
    } 
} 

स्टैकट्रेस

at System.Net.Http.HttpContent.CheckDisposed() 
    at System.Net.Http.HttpContent.ReadAsStringAsync() 
    at Roadsmart.Service.RoadsmartService.<GetNewUser>d__2e.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at Roadsmart.ViewModel.SettingsPageViewModel.<SetNewProfilePicture>d__1e.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__3(Object state) 
    at System.Threading.WinRTSynchronizationContext.Invoker.InvokeCore() 
+1

आप 'जारी रखें' के साथ 'प्रतीक्षा' क्यों जोड़ रहे हैं? –

+0

आप 'जारी रखें' का उपयोग क्यों कर रहे हैं? Async/await से निपटने के दौरान आपको 'ContinueWith' का उपयोग करने की आवश्यकता नहीं है। –

उत्तर

8

ObjectDisposedException फेंक दिया जाता है क्योंकि आप HttpRequestMessage और HttpClient से पहले निपटाने रहे हैं req.Content.ReadAsStringAsync() खत्म होता है।

ध्यान दें कि req.Content.ReadAsStringAsync() एक असीमित विधि है। HttpClient का निपटान करने से पहले आपको इसे पूरा करने की प्रतीक्षा करनी होगी।

इसके अलावा, आप पर req.Content पर कॉल कर रहे हैं, तो यह response.Content नहीं होना चाहिए?

using (HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_USERS + "/data")) 
{ 
    req.Content = new StringContent(userguidJSON, Encoding.UTF8, "application/json"); 
    var response = await httpClient.SendAsync(req); 
    var result = await response.Content.ReadAsStringAsync();//await it 
    Debug.WriteLine(result); 
    return null; 
} 

लगभग हो गया है जब async के साथ काम कर ContinueWith उपयोग करने के लिए कोई कारण नहीं है/का इंतजार है। यह सब आपके लिए कंपाइलर द्वारा किया जाता है।

+0

ठीक है टिप के लिए धन्यवाद, लेकिन त्रुटि अब परिणाम के बाद फेंक दिया गया है ... एक डिस्पोजेड ऑब्जेक्ट तक नहीं पहुंच सकता है। ऑब्जेक्ट का नाम: 'System.Net.Http.StringContent'। – tim

+0

@ सेआशर्प अब अपवाद क्या है? स्टैकट्रैक और अपना अपडेटेड कोड पोस्ट करें। –

+0

हो गया। पहले से ही मदद के लिए धन्यवाद। – tim

4

आप अनुरोध सामग्री तक पहुंच रहे हैं, प्रतिक्रिया नहीं।

यह

await httpClient.SendAsync(req); 
var result = await req.Content.ReadAsStringAsync(); //Cannot access a disposed object. Object name: 'System.Net.Http.StringContent'. 

var response = httpClient.SendAsync(req); 
var result = await response.Content.ReadAsStringAsync(); 
+0

बस बहुत देर हो चुकी है :) – tim

4

वास्तविक कारण क्योंकि HttpClient disposes Content तुरंत एक पूर्ण किया गया अनुरोध के बाद ObjectDisposedException फेंक दिया जाता है है होना चाहिए। docs पर एक नज़र डालें।

तो अगर आप एक Request के परीक्षण में उदाहरण के लिए सामग्री, पढ़ने की जरूरत है, बुला SendAsync पहले यह को पढ़ने के लिए सुनिश्चित करें।

+0

मैंने भी इस समस्या को मारा।यदि आप एक ही 'सामग्री' को दो बार (एक टाइमआउट या इसी तरह के बाद) भेजने का प्रयास करते हैं, तो आपको ऑब्जेक्ट डिस्प्ले एक्सेप्शन जानकारी के लिए, ऐसा लगता है कि यह संदर्भ स्रोत में तय किया गया है: https://github.com/ डॉटनेट/कोरफैक्स/ब्लॉब/मास्टर/src/System.Net.Http/src/System/net/http/HttpClient.cs # L517 (हालांकि मैं अभी भी System.Net.Http का उपयोग कर एक ही समस्या देख रहा हूं, संस्करण = 4.0.0.0) –

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