Как получить код состояния HTTP, возвращаемый WinPhone WebClient?

Мне нужно отправить фрагмент текста на HTTP-сервер. Мне нужно знать с приличной долей уверенности, что он был успешно отправлен, а не отправлен на портал захвата или что-то в этом роде. Однако из-за некоторых ограничений HTTP-сервера мой лучший способ определить это — убедиться, что возвращаемый код состояния HTTP равен 200.

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

Это мой текущий код:

        WebClient client = new WebClient();
        client.Headers["Content-Type"] = "text/xml";
        client.Encoding = Encoding.UTF8;
        bool? result=null;
        try
        {
            client.UploadStringAsync(server, "POST", data);
            client.UploadStringCompleted += (s, e) =>
                {
                    result=e.Error == null;
                };
        }
        catch { }

В настоящее время e.Error будет установлено, когда сервер вернет код ошибки 400-500, но не в том случае, если сервер вернет серию 300 кодов состояния HTTP.


person Earlz    schedule 02.04.2013    source источник
comment
Вопрос: Ваш сервер правильно возвращает HTTP-коды? e.Result содержит фактический ответ   -  person AFD    schedule 02.04.2013
comment
@ADNow e.Result в настоящее время будет пустым, если он выполнен успешно. Единственный признак успеха, если код состояния 200. Мы пытаемся определить, находится ли телефон внутри закрытого портала, который перенаправляет весь трафик.   -  person Earlz    schedule 02.04.2013
comment
Я думаю, что WebClient упрощен. Можешь нырнуть глубже? Если вы используете HttpWebRequest, вы можете получить код состояния как var response = we.Response as HttpWebResponse; var code = response.StatusCode;   -  person AFD    schedule 02.04.2013
comment
@ADNow Сделайте ответ, и я его приму, особенно если вы быстро преобразуете мой существующий код :)   -  person Earlz    schedule 02.04.2013


Ответы (1)


У меня не было возможности протестировать этот код, однако он может дать вам пару идей:

 string data;

        var request = HttpWebRequest.Create("http://yourserver") as HttpWebRequest;
        request.Accept = "text/xml";
        request.Headers.Add("Accept-Charset", "utf-8");

        try
        {
            var response = await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);

            // do something with your data, e.g. read it, deserialize it
            using (var responseStream = response.GetResponseStream())
            {
                using (var reader = new StreamReader(responseStream))
                {
                    data = reader.ReadToEnd();
                }
                // ....
            }

            var somethingInteresting = response as HttpWebResponse;
            Debug.WriteLine("Status is {0}", somethingInteresting.StatusCode);
        }
        catch (WebException ex)
        {
            var errorResponse = ex.Response as HttpWebResponse;
            var errorHttpStatusCode = errorResponse.StatusCode;

            Debug.WriteLine("Here's your error Http status: {0}", ex.Status);
        }
person AFD    schedule 02.04.2013
comment
Хех, самое забавное во всем этом то, что Windows Phone фактически нарушает часть спецификации HTTP с этим поведением WebClient. Если код состояния 302 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, так как это может изменить условия, при которых был выдан запрос. - person Earlz; 02.04.2013