How to get status code from webclient?

前端 未结 10 1751
轮回少年
轮回少年 2020-11-29 04:03

I am using the WebClient class to post some data to a web form. I would like to get the response status code of the form submission. So far I\'ve found out how

相关标签:
10条回答
  • 2020-11-29 04:54

    You can check if the error is of type WebException and then inspect the response code;

    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!");
    }
    

    or

    try
    {
        // send request
    }
    catch (WebException e)
    {
        // check e.Status as above etc..
    }
    
    0 讨论(0)
  • 2020-11-29 04:59

    This is what I use for expanding WebClient functionality. StatusCode and StatusDescription will always contain the most recent response code/description.

                    /// <summary>
                    /// An expanded web client that allows certificate auth and 
                    /// the retrieval of status' for successful requests
                    /// </summary>
                    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;
                        }
                        /// <summary>
                        /// The most recent response statusCode
                        /// </summary>
                        public HttpStatusCode StatusCode { get; set; }
                        /// <summary>
                        /// The most recent response statusDescription
                        /// </summary>
                        public string StatusDescription { get; set; }
                    }
    

    Thus you can do a post and get result via:

                byte[] response = null;
                using (WebClientCert client = new WebClientCert())
                {
                    response = client.UploadValues(postUri, PostFields);
                    HttpStatusCode code = client.StatusCode;
                    string description = client.StatusDescription;
                    //Use this information
                }
    
    0 讨论(0)
  • 2020-11-29 05:00

    Erik's answer doesn't work on Windows Phone as is. The following does:

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

    At least it does when using OpenReadAsync; for other xxxAsync methods, careful testing would be highly recommended. The framework calls GetWebResponse somewhere along the code path; all one needs to do is capture and cache the response object.

    The fallback code is 200 in this snippet because genuine HTTP errors - 500, 404, etc - are reported as exceptions anyway. The purpose of this trick is to capture non-error codes, in my specific case 304 (Not modified). So the fallback assumes that if the status code is somehow unavailable, at least it's a non-erroneous one.

    0 讨论(0)
  • 2020-11-29 05:05

    You should use

    if (e.Status == WebExceptionStatus.ProtocolError)
    {
       HttpWebResponse response = (HttpWebResponse)ex.Response;             
       if (response.StatusCode == HttpStatusCode.NotFound)
          System.Diagnostics.Debug.WriteLine("Not found!");
    }
    
    0 讨论(0)
提交回复
热议问题