Обрабатывать сообщение об ошибке json из REST API через HTTPWebRepsonse

Я использую REST API (предоставляемый клиентом) в C#/asp.net и управляю результатом json, возвращаемым этим REST API. я потребляю его по следующему коду.

     HttpWebResponse res = null;
     string ReturnBody = string.Empty;

   string requestBody = string.Empty;
                WebRequest request = WebRequest.Create(Path);
                request.ContentType = "application/json";
                request.Method = "POST";
                request.ContentLength = json.Length;

                //Add Basic Auhtentication header
                string authInfo = Username + ":" + Password;
                authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
                request.Headers["Authorization"] = "Basic " + authInfo;

                System.IO.StreamWriter sw = new System.IO.StreamWriter(request.GetRequestStream());
                sw.Write(json);
                sw.Close();
                res = (HttpWebResponse)request.GetResponse();
                if (res != null)
                {
                    using (StreamReader sr = new StreamReader(res.GetResponseStream(), true))
                    {
                        ReturnBody = sr.ReadToEnd();
                        StringBuilder s = new StringBuilder();
                        s.Append(ReturnBody);
                        sr.Close();
                    }
                }

Я поместил приведенный выше код в блок try catch, поэтому он работает правильно, если он вернет код успеха (200), поэтому я могу использовать ответ json от объекта res в соответствии с приведенным выше кодом.

но когда этот REST API выдает ошибку, он будет перенаправлен на catch, а res будет null, поэтому я не могу получить доступ к json-ответу сообщения об ошибке, поскольку я могу получить его >Fiddler, как показано на рис.

REST-тест через скрипач

так что помогите мне с Как я могу использовать этот ответ об ошибке json через свой код?

Заранее спасибо! за любую помощь.


person Arun Rana    schedule 02.03.2012    source источник


Ответы (1)


Вероятно, вы получите WebException — проверьте status. В вашем случае это будет указывать на ошибку протокола, т.е. 401/403 и т. д. В таком случае Свойство ="nofollow">Response можно использовать для получения фактического ответа HTTP. Например,

try
{
   res = (HttpWebResponse)request.GetResponse();
   // handle successful response
   ...
}
catch(WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
       var response = (HttpWebResponse)ex.Response;
       // use the response as needed - in your case response.StatusCode would be 403
       // and body will have JSON describing the error.
       ..  
    }
    else
    {
       // handle other errors, perhaps re-throw
       throw;
    }
}
person VinayC    schedule 02.03.2012
comment
Спасибо, именно то, что я искал, только один вопрос, когда он перейдет к else{thow;} (некоторые примеры)? поэтому я могу правильно справиться с этим в оригинальном улове (исключение ex). - person Arun Rana; 02.03.2012
comment
@ArunRana, укажите значение WebExceptionStatus - msdn.microsoft.com/en -нас/библиотека/. Например, сбой DNS, время ожидания запроса и т. д. приведет вас к другой части. - person VinayC; 05.03.2012