Как получить код статуса из веб-клиента?

Я использую class WebClient для публикации некоторых данных в веб-форме. Я хотел бы получить код статуса ответа формы. До сих пор я узнал, как получить код состояния, если есть исключение

 Catch wex As WebException If TypeOf wex.Response Is HttpWebResponse Then msgbox(DirectCast(wex.Response, HttpWebResponse).StatusCode) End If 

Однако, если форма отправлена ​​успешно и исключение не выбрано, я не буду знать код состояния (200, 301, 302, …)

Есть ли способ получить код состояния при отсутствии исключений?

PS: Я предпочитаю не использовать httpwebrequest / httpwebresponse

10 Solutions collect form web for “Как получить код статуса из веб-клиента?”

Пробовал. ResponseHeaders не include код состояния.

Если я не ошибаюсь, WebClient способен абстрагировать несколько различных запросов одним вызовом метода (например, правильно обрабатывать ответы 100 Continue, перенаправления и т. П.). Я подозреваю, что без использования HttpWebRequest и HttpWebResponse отдельный код состояния может быть недоступен.

Мне приходит в голову, что, если вас не интересуют промежуточные коды состояния, вы можете с уверенностью предположить, что окончательный код состояния находится в диапазоне 2xx (успешный), в противном случае вызов не будет успешным.

К сожалению, код статуса отсутствует в словаре ResponseHeaders .

Вы можете проверить, является ли ошибка типа WebException а затем проверить код ответа;

 if (e.Error.GetType().Name == "WebException") { WebException we = (WebException)e.Error; HttpWebResponse response = (System.Net.HttpWebResponse)we.Response; if (response.StatusCode==HttpStatusCode.NotFound) System.Diagnostics.Debug.WriteLine("Not found!"); } 

или

 try { // send request } catch (WebException e) { // check e.Status as above etc.. } 

Есть способ сделать это, используя reflection. Он работает с .NET 4.0. Он обращается к частному полю и может не работать в других версиях .NET без изменений.

Я понятия не имею, почему Microsoft не раскрыла это поле со свойством.

 private static int GetStatusCode(WebClient client, out string statusDescription) { FieldInfo responseField = client.GetType().GetField("m_WebResponse", BindingFlags.Instance | BindingFlags.NonPublic); if (responseField != null) { HttpWebResponse response = responseField.GetValue(client) as HttpWebResponse; if (response != null) { statusDescription = response.StatusDescription; return (int)response.StatusCode; } } statusDescription = null; return 0; } 

Другой путь:

 class BetterWebClient : WebClient { private WebRequest _Request = null; protected override WebRequest GetWebRequest(Uri address) { this._Request = base.GetWebRequest(address); if (this._Request is HttpWebRequest) { ((HttpWebRequest)this._Request).AllowAutoRedirect = false; } return this._Request; } public HttpStatusCode StatusCode() { HttpStatusCode result; if (this._Request == null) { throw (new InvalidOperationException(@"Unable to retrieve the status code, maybe you haven't made a request yet.")); } HttpWebResponse response = base.GetWebResponse(this._Request) as HttpWebResponse; if (response != null) { result = response.StatusCode; } else { throw (new InvalidOperationException(@"Unable to retrieve the status code, maybe you haven't made a request yet.")); } return result; } } 

Ответ Эрика не работает на Windows Phone, как есть. Следующее:

 class WebClientEx : WebClient { private WebResponse m_Resp = null; protected override WebResponse GetWebResponse(WebRequest Req, IAsyncResult ar) { return m_Resp = base.GetWebResponse(Req, ar); } public HttpStatusCode StatusCode { get { if (m_Resp != null && m_Resp is HttpWebResponse) return (m_Resp as HttpWebResponse).StatusCode; else return HttpStatusCode.OK; } } } 

По крайней мере, при использовании OpenReadAsync ; для других методов xxxAsync рекомендуется тщательное тестирование. Структура вызывает GetWebResponse где-то вдоль пути кода; все, что нужно сделать, это захват и кэширование объекта ответа.

Код возврата составляет 200 в этом fragmentе, потому что истинные ошибки HTTP – 500, 404 и т. Д. – все равно являются исключениями. objective этого трюка – захватить коды без ошибок, в моем конкретном случае 304 (не изменено). Таким образом, резерв предполагает, что если код состояния каким-то образом недоступен, по крайней мере, он не является ошибочным.

Вы должны использовать

 if (e.Status == WebExceptionStatus.ProtocolError) { HttpWebResponse response = (HttpWebResponse)ex.Response; if (response.StatusCode == HttpStatusCode.NotFound) System.Diagnostics.Debug.WriteLine("Not found!"); } 

На всякий случай кому-то нужна версия F # описанного выше взлома.

 open System open System.IO open System.Net type WebClientEx() = inherit WebClient () [] val mutable m_Resp : WebResponse override x.GetWebResponse (req: WebRequest ) = x.m_Resp < - base.GetWebResponse(req) (req :?> HttpWebRequest).AllowAutoRedirect < - false; x.m_Resp override x.GetWebResponse (req: WebRequest , ar: IAsyncResult ) = x.m_Resp <- base.GetWebResponse(req, ar) (req :?> HttpWebRequest).AllowAutoRedirect < - false; x.m_Resp member x.StatusCode with get() : HttpStatusCode = if not (obj.ReferenceEquals (x.m_Resp, null)) && x.m_Resp.GetType() = typeof then (x.m_Resp :?> HttpWebResponse).StatusCode else HttpStatusCode.OK let wc = new WebClientEx() let st = wc.OpenRead("http://www.stackoverflow.com") let sr = new StreamReader(st) let res = sr.ReadToEnd() wc.StatusCode sr.Close() st.Close() 

Это то, что я использую для расширения функциональности WebClient. StatusCode и StatusDescription всегда будут содержать самый последний код / ​​описание ответа.

  ///  /// An expanded web client that allows certificate auth and /// the retrieval of status' for successful requests ///  public class WebClientCert : WebClient { private X509Certificate2 _cert; public WebClientCert(X509Certificate2 cert) : base() { _cert = cert; } protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); if (_cert != null) { request.ClientCertificates.Add(_cert); } return request; } protected override WebResponse GetWebResponse(WebRequest request) { WebResponse response = null; response = base.GetWebResponse(request); HttpWebResponse baseResponse = response as HttpWebResponse; StatusCode = baseResponse.StatusCode; StatusDescription = baseResponse.StatusDescription; return response; } ///  /// The most recent response statusCode ///  public HttpStatusCode StatusCode { get; set; } ///  /// The most recent response statusDescription ///  public string StatusDescription { get; set; } } 

Таким образом, вы можете сделать сообщение и получить результат через:

  byte[] response = null; using (WebClientCert client = new WebClientCert()) { response = client.UploadValues(postUri, PostFields); HttpStatusCode code = client.StatusCode; string description = client.StatusDescription; //Use this information } 

Вы должны иметь возможность использовать вызов «client.ResponseHeaders [..]», см. Эту ссылку для получения примеров возврата материала из ответа

Вы можете попробовать этот код, чтобы получить код статуса HTTP из WebException или из OpenReadCompletedEventArgs.Error. Он также работает в Silverlight, потому что у SL нет WebExceptionStatus.ProtocolError.

 HttpStatusCode GetHttpStatusCode(System.Exception err) { if (err is WebException) { WebException we = (WebException)err; if (we.Response is HttpWebResponse) { HttpWebResponse response = (HttpWebResponse)we.Response; return response.StatusCode; } } return 0; } 
  • Как отправить данные на определенный URL-адрес с помощью WebClient в C #
  • ASP.NET-controller: asynchronous модуль или обработчик завершен, пока асинхронная операция все еще находится на рассмотрении
  • Загрузите и загрузите двоичный файл на / из FTP-сервера в C # /. NET
  • HTTP POST возвращает ошибку: 417 «Ожидание не выполнено».
  • Печально известная, но без ответа проблема загрузки файла, когда требуется защита Windows
  • Установите тайм-аут для webClient.DownloadFile ()
  • Автоматически распаковывать ответ gzip через WebClient.DownloadData
  • C # webclient и прокси-сервер
  • Войдите на сайт, через C #
  • Возможно ли передать аутентификацию из Webbrowser в WebRequest
  • WebClient vs. HttpWebRequest / HttpWebResponse
  • Interesting Posts

    Как вы создаете Preference Activity и Preference Fragment на Android?

    Я продолжаю получать этот код ошибки mysql # 1089

    Облачные вычисления и веб-сайты для обмена файлами?

    Зарядное устройство HP с ноутбуком Dell

    Отклонить двоичный код с состоянием, ожидающим проверки (не может найти двоичную кнопку отклонения)

    Применение classаName / onClick / onChange не работает с компонентом Custom React

    Как запустить полностью независимый процесс из Java-программы?

    count количество строк в кадре данных в R на основе группы

    Как проверить частную функцию или class с частными методами, полями или внутренними classами?

    Ядро Linux: пример подключения к системному вызову

    Запустите действие при добавлении USB-устройства

    Excel 2010 Перемещение данных из нескольких столбцов / строк в одну строку

    Есть ли поддержка Linux для TRIM на дисках SSD?

    Предотвращение всплывающего подтверждения при обновлении полей в Word

    Spring Boot – Как регистрировать все запросы и ответы с исключениями в одном месте?

    Давайте будем гением компьютера.