Как разобрать внутреннюю ошибку сервера, которая произошла во время асинхронной записи HTTP? - PullRequest
2 голосов
/ 16 августа 2011

Я делаю то, что обычно является простым сообщением http на Windows Phone 7 (код ниже). Когда я смотрю на fiddler во время поста, я вижу этот результат с сервера

HTTP / 1.1 500 Внутренняя ошибка сервера Cache-Control: частная Тип контента: приложение / JSON; charset = utf-8 Сервер: Microsoft-IIS / 7.5 jsonerror: true X-AspNet-Version: 2.0.50727 X-сервер: www03 X-Site: prod Дата: вторник, 16 августа 2011 г. 03:49:51 GMT Длина контента: 220

{"Сообщение": "Приносим извинения ...}

Когда я помещаю попытку перехватить пост асинхронной записи, я не могу найти ничего, кроме

{System.Net.WebException: удаленный сервер возвратил ошибку: Не обнаружена. ---> System.Net.WebException: удаленный сервер возвратил ошибка: NotFoun ...

У меня такой вопрос: как я могу получить реальное сообщение (показанное в fiddler) из этого исключения? или как мне вообще избежать этого исключения и вернуть json, чтобы я мог разобрать его на предмет фактического сообщения об ошибке?

Заранее спасибо

    public void Checkout(ResponseAndCookies responseAndCookies)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/checkout");
        request.ContentType = "application/json";
        request.CookieContainer = responseAndCookies.CookieContainer;
        request.Method = "POST";
        request.AllowAutoRedirect = false;
        request.Accept = "application/json";

        request.BeginGetRequestStream(new AsyncCallback(GetRequest), request);
    }

    private void GetRequest(IAsyncResult asyncResult)
    {
        var json = "{\"valid\":true}";
        byte[] byteArray = Encoding.UTF8.GetBytes(json);

        HttpWebRequest request = (HttpWebRequest) asyncResult.AsyncState;
        Stream newStream = request.EndGetRequestStream(asyncResult);
        newStream.Write(byteArray, 0, byteArray.Length);
        newStream.Close();

        request.BeginGetResponse(new AsyncCallback(GetResponse), request);
    }

    private void GetResponse(IAsyncResult asyncResult)
    {
            var response = ReadResponse(asyncResult); //if I try catch this I get the exception listed above :(
    }

    private ResponseAndCookies ReadResponse(IAsyncResult result)
    {
        Stream dataStream = null;
        HttpWebRequest request = (HttpWebRequest) result.AsyncState;
        HttpWebResponse response = request.EndGetResponse(result) as HttpWebResponse;
        dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        response.Close();   

        var responseAndCookies = new ResponseAndCookies
                                     {CookieContainer = request.CookieContainer, Markup = responseFromServer};

        return responseAndCookies;
    }

1 Ответ

1 голос
/ 16 августа 2011

HTTP 500 отличается от «Not Found» (это будет HTTP 404). Так что ваше исключение на самом деле не связано. В любом случае вам, очевидно, необходимо прочитать поток ответа на контент.

Вы можете прочитать ответ, используя свойство WebException.Response внутри предложения catch.

Когда это произойдет, я бы порекомендовал вам взглянуть на такие рамки, как RestSharp . Нет смысла писать столько кода самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...