簡體   English   中英

HttpWebRequest引發的C#HTTP 400錯誤(錯誤請求)(間歇性)

[英]c# HTTP 400 error (Bad Request) thrown by HttpWebRequest (intermitent)

我對Web服務有問題。 從Web方法中,我調用此其他方法來發出HTTP請求。 我需要做的是從URL獲取XML響應並對其進行處理。 這是我發出HTTP請求的代碼:

    private XmlDocument makeHTTPrequest(string url, string parametersStr)
    {
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);

        byte[] buffer = Encoding.ASCII.GetBytes(parametersStr);
        Stream sAnswer = null;
        XmlDocument xDoc = new XmlDocument();
        string proxyAddress = "";
        int proxyPort = 0;
        int requestTimeout = 0;

        try
        {
            proxyAddress = ConfigurationSettings.AppSettings["ProxyAddress"];
            proxyPort = Convert.ToInt32(ConfigurationSettings.AppSettings["ProxyPort"]);
            requestTimeout = Convert.ToInt32(ConfigurationSettings.AppSettings["RequestTimeout"]);

            WebReq.Method = "POST";
            WebReq.ContentType = "application/x-www-form-urlencoded";
            WebReq.ContentLength = buffer.Length;

            if (proxyAddress != "0" && proxyPort != 0)
            {
                WebProxy proxy = null;
                proxy = new WebProxy(proxyAddress, proxyPort);
                proxy.UseDefaultCredentials = true;
                WebReq.Proxy = proxy;
            }

            if (requestTimeout != 0)
            {
                WebReq.Timeout = requestTimeout;
            }

            Stream PostData = WebReq.GetRequestStream();
            PostData.Write(buffer, 0, buffer.Length);
            PostData.Close();

            HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
            if (WebResp.StatusCode == HttpStatusCode.OK)
            {
                sAnswer = WebResp.GetResponseStream();
                xDoc.Load(sAnswer);
            }
            else
            {
                throw new Exception("No se obtuvo una respuesta satisfactoria del servidor\r\nHTTP Error Code:" + WebResp.StatusCode.ToString());
            }

            if (xDoc == null) throw new Exception("El XmlDocument obtenido de DineroMail es null");

            return xDoc;
        }
        catch (Exception ex)
        {
            string datosStr = "";
            foreach (DictionaryEntry entry in ex.Data)
            {
                datosStr = entry.Key.ToString() + ": " + entry.Value.ToString() + "\r\n";
            }
            this.WriteToEventLog("Metodo makeHTTPrequest(string url, string parametersStr)\r\nParametros: url=" + url + " parametersStr= " + parametersStr + "\r\nDatos Excepcion (Cantidad "+ex.Data.Count.ToString()+"):\r\n"+ datosStr +"Descripcion:\r\n" + ex.Message + "\r\nSource:\r\n" + ex.Source + "\r\nStackTrace:\r\n" + ex.StackTrace + "\r\n");
            throw ex;
        }
    }

這在我的開發環境(我的PC)上可以正常工作,但是當我移到生產服務器環境(帶有IIS的Windows 2008)時,發出WebRequest時出現HTTP 400錯誤。 使調試變得更加困難的情況是間斷發生的。 這意味着它可以正常工作一段時間,但是一段時間后它將停止工作並引發HTTP 400錯誤。 另一個額外的信息:從Web服務的另一個Web方法調用另一個Web服務,有時它也會間歇性地引發相同的錯誤。 另一個額外的信息:我通過公司Proxy訪問Internet有人知道有什么問題嗎? 我一直在努力解決這一問題,但沒有運氣,所以歡迎提出任何想法:-)

謝謝!

此處報告了類似的問題: .Net HttpWebRequest.GetResponse()在返回HTTP狀態代碼400(錯誤請求)時引發異常

我也注意到您沒有處置Response對象。 先前的響應仍在垃圾收集器的完成隊列中仍然會引起問題嗎?

using( HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse() )
{
  if (WebResp.StatusCode == HttpStatusCode.OK)
            {
                sAnswer = WebResp.GetResponseStream();
                xDoc.Load(sAnswer);
            }
            else
            {
                throw new Exception("No se obtuvo una respuesta satisfactoria del servidor\r\nHTTP Error Code:" + WebResp.StatusCode.ToString());
            }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM