2012-06-28 16 views
11

हाय मैं HttpClient इस के समान उपयोग कर रहा हूँ:HttpClient - कुल अपवाद के साथ काम कर

public static Task<string> AsyncStringRequest(string url, string contentType) 
{ 
    try 
    { 
     var client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType)); 

     return client.GetStringAsync(url).ContinueWith(task => { 
      return task.Result; 
     }); 
    } 
    catch (AggregateException ex) 
    { 
     throw ex; 
    } 
    catch (WebException ex) 
    { 
     throw ex; 
    }  
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

लेकिन मैं कठिनाइयों अपवाद के साथ काम कर रहा हूँ। मैंने कोशिश करने और कदम फेंकने के लिए अतिरिक्त पकड़ ब्लॉक जोड़े हैं, लेकिन किसी भी पकड़ ब्लॉक में ब्रेक पॉइंट्स में से कोई भी पकड़ा नहीं गया है। मुझे कार्य का उपयोग करने का एहसास है कि अपवाद कॉलर की तुलना में एक अलग थ्रेड पर हो सकता है ताकि अपवाद को एक कंटेनर में लपेटा जा सके, लेकिन मुझे यकीन नहीं है कि इन अपवादों से निपटने का सबसे अच्छा तरीका क्या है।

उदाहरण के लिए मैं एक वेब सेवा का अनुरोध करता हूं और अनुरोध में एक अमान्य पैरामीटर निर्दिष्ट करता हूं, और एक अपवाद फेंक दिया जाता है। मैं चाहता हूं कि मैं कुल अपवादों को पकड़ सकूं और यह जानने के लिए अपर्याप्त विचारों को देख सकूं कि अनुरोध क्यों विफल हुआ है और एक दोस्ताना संदेश लौटाता है।

तो मेरा सवाल यह है कि, इन असाधारण अपवादों को पकड़ने और उनके साथ सौदा करने का सबसे अच्छा तरीका क्या है?

उत्तर

18

अपवाद task.Result द्वारा फेंका जाता है:

var client = new HttpClient(); 
client.DefaultRequestHeaders.Accept.Add(...); 
return client.GetStringAsync(url).ContinueWith(task => 
{ 
    try 
    { 
     return task.Result; 
    } 
    catch (AggregateException ex) 
    { 
     throw ex; 
    } 
    catch (WebException ex) 
    { 
     throw ex; 
    }  
    catch (Exception ex) 
    { 
     throw ex; 
    } 
}); 

बेहतर: जाँच लें कि कार्य faulted एक्सेस करने से पहले task.Result: आप वास्तव में ContinueWith में कुछ कर रही नहीं कर रहे हैं

var client = new HttpClient(); 
client.DefaultRequestHeaders.Accept.Add(...); 
return client.GetStringAsync(url).ContinueWith(task => 
{ 
    if (task.IsFaulted) 
    { 
     var ex = task.Exception; 
    } 
    else if (task.IsCancelled) 
    { 
    } 
    else 
    { 
     return task.Result; 
    } 
}); 

, आप कर सकते हैं बस इसे छोड़ दें:

var client = new HttpClient(); 
client.DefaultRequestHeaders.Accept.Add(...); 
return client.GetStringAsync(url); 
+0

बढ़िया, मैं इसे अगले घंटे में कोशिश करूँगा! – gdp

+9

मुझे पता है कि यह एक पुराना सवाल है, लेकिन क्या http स्थिति कोड को कुल मिलाकर से प्राप्त करने का कोई तरीका है, जैसे आप एक अपहरण को पकड़ते समय कर सकते हैं? – gdp

+0

@gdp: हां, आप समेकित अपवाद पर फ़्लाइटन को कॉल कर सकते हैं और फिर इनरएक्सप्सेप्शन प्रॉपर्टी तक पहुंच सकते हैं और इसके भीतर निहित वेबएक्सप्शन को खींच सकते हैं। –