2011-09-30 34 views
34

Tôi đang sử dụng Facebook Graph Api và cố gắng lấy dữ liệu người dùng. Tôi sẽ gửi cho người dùng truy cập token và trong trường hợp thẻ này hết hạn hoặc không hợp lệ Facebook trả về mã trạng thái 400 và phản ứng này:Làm thế nào để xử lý WebResponse khi .NET ném WebException ((400) Yêu cầu Xấu)?

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

Vấn đề là khi tôi sử dụng mã này C#:

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

Nếu mã trạng thái là 400 .NET ném WebException và webResponse của tôi là null sau khi ngoại lệ bị bắt, vì vậy tôi không có cơ hội xử lý nó. Tôi muốn làm điều đó để đảm bảo rằng vấn đề là trong mã thông báo hết hạn và không phải ở một nơi nào khác.

Có cách nào để làm điều đó không?

Cảm ơn.

Trả lời

72

Sử dụng một khối try/catch như thế này và xử lý các thông báo lỗi một cách thích hợp sẽ làm việc tốt:

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 
       } 
      } 
     } 
    } 
} 

Tuy nhiên, bằng cách sử dụng Facebook C# SDK làm tất cả điều này thực sự dễ dàng để bạn không cần phải xử lý này cho mình .

+0

Cảm ơn câu trả lời chi tiết, tôi đã thực hiện nó alredy theo cách tương tự. Tôi biết rằng tôi có thể sử dụng Facebook SDK, nhưng sử dụng api Facebook là tương đối dễ dàng so với Google hoặc Twitter vì vậy tôi đã quyết định làm mọi thứ theo cách thủ công ở đây để hiểu luồng và kiểm soát nhiều hơn. – Burjua

+0

Bất cứ ai cũng biết tại sao WebException -> errorResponse.GetResponseStream() là null trong Silverlight? Tôi có thể thấy phản ứng của cơ thể trong Fiddler. –

+0

Đó là vô giá đối với tôi. Làm một chút đào. Điều này hoạt động như mong đợi khi được biên dịch trong .net bình thường. –

14

WebException vẫn có phản hồi "thực" trong thuộc tính Response (giả sử có phản hồi) để bạn có thể lấy dữ liệu từ đó trong khối catch.

+0

Cảm ơn Jon, bạn có nên thử truy cập thuộc tính 'Response' ở đó không? điều gì sẽ xảy ra nếu tôi nhận được một ngoại lệ bên trong khối 'catch'? tôi có nên đặt 'try and catch' của mình vào bên trong 'try and catch' khác không? – Burjua

+0

@Burjua: Truy cập tài sản sẽ không cung cấp cho bạn một ngoại lệ - đó là những gì nó có cho, sau khi tất cả. Tôi * tin rằng phản hồi sẽ chứa tất cả dữ liệu phản hồi, vì vậy việc đọc luồng phản hồi sẽ an toàn nếu bạn quản lý nó. –

Các vấn đề liên quan