2011-09-30 10 views
34

मैं फेसबुक ग्राफ एपीआई का उपयोग कर रहा हूं और उपयोगकर्ता डेटा प्राप्त करने का प्रयास कर रहा हूं। मैं उपयोगकर्ता पहुँच भेज रहा टोकन और मामले में इस टोकन समाप्त हो जाता है या अमान्य फेसबुक स्थिति कोड 400 और यह प्रतिक्रिया लौटाता:WebResponse को कैसे संसाधित करें जब .NET WebException ((400) खराब अनुरोध फेंकता है)?

{ 
    "error": { 
     "message": "Error validating access token: The session is invalid because the user logged out.", 
     "type": "OAuthException" 
    } 
} 

समस्या यह है कि जब मैं इस सी # कोड का उपयोग करें:

try { 
    webResponse = webRequest.GetResponse(); // in case of status code 400 .NET throws WebException here 
} catch (WebException ex) { 
} 

यदि स्टेटस कोड 400 है .NET WebException फेंकता है और अपवाद पकड़े जाने के बाद null है तो मुझे इसे संसाधित करने का कोई मौका नहीं है। मैं यह सुनिश्चित करने के लिए यह करना चाहता हूं कि समस्या समाप्त हो गई टोकन में है और कहीं और नहीं।

क्या ऐसा करने का कोई तरीका है?

धन्यवाद।

उत्तर

72

इस तरह एक आज़माएं/कैच ब्लॉक का उपयोग करना और प्रसंस्करण त्रुटि संदेश उचित रूप से ठीक से काम करना चाहिए:

var request = (HttpWebRequest)WebRequest.Create(address); 
    try { 
     using (var response = request.GetResponse() as HttpWebResponse) { 
      if (request.HaveResponse && response != null) { 
       using (var reader = new StreamReader(response.GetResponseStream())) { 
        string result = reader.ReadToEnd(); 
       } 
      } 
     } 
    } 
    catch (WebException wex) { 
     if (wex.Response != null) { 
      using (var errorResponse = (HttpWebResponse)wex.Response) { 
       using (var reader = new StreamReader(errorResponse.GetResponseStream())) { 
        string error = reader.ReadToEnd(); 
        //TODO: use JSON.net to parse this string and look at the error message 
       } 
      } 
     } 
    } 
} 

हालांकि, का उपयोग कर Facebook C# SDK यह सब वास्तव में आसान बना देता है ताकि आप अपने आप को इस पर कार्रवाई की जरूरत नहीं है ।

+0

विस्तृत उत्तर के लिए धन्यवाद, मैंने इसे इसी तरह से किया है। मुझे पता है कि मैं फेसबुक एसडीके का उपयोग कर सकता हूं, लेकिन फेसबुक एपीआई का उपयोग करना Google या ट्विटर के मुकाबले अपेक्षाकृत आसान है, इसलिए मैंने प्रवाह को समझने और अधिक नियंत्रण रखने के लिए मैन्युअल रूप से सब कुछ करने का फैसला किया। – Burjua

+0

कोई भी जानता है क्यों WebException -> errorResponse.GetResponseStream() सिल्वरलाइट में शून्य है? हालांकि मैं फिडलर में शरीर की प्रतिक्रिया देख सकता हूं। –

+0

यह मेरे लिए भी शून्य है। खोदने का थोड़ा सा करना। यह सामान्य .NET में संकलित होने पर अपेक्षित कार्य करता है। –

14

WebExceptionResponse संपत्ति में अभी भी "असली" प्रतिक्रिया है (माना जाता है कि वहां कोई प्रतिक्रिया थी) ताकि आप catch ब्लॉक के भीतर से डेटा प्राप्त कर सकें।

+0

धन्यवाद जॉन, क्या वहां 'प्रतिक्रिया' संपत्ति तक पहुंचने का प्रयास करना एक अच्छा विचार है? अगर मुझे 'कैच' ब्लॉक के अंदर अपवाद मिलता है तो क्या होगा? क्या मुझे अपना 'प्रयास करने और पकड़ने' के अंदर 'कोशिश करें और पकड़' रखना चाहिए? – Burjua

+0

@ बुर्जुआ: संपत्ति तक पहुंचने से आपको अपवाद नहीं मिलेगा - यही वह सब कुछ है, इसके बाद। मैं * विश्वास करता हूं कि प्रतिक्रिया में पहले से ही सभी प्रतिक्रिया डेटा शामिल होंगे, इसलिए यदि आप इसे प्राप्त करने का प्रबंधन करते हैं तो प्रतिक्रिया स्ट्रीम को स्वयं ही सुरक्षित रखना चाहिए। –

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