【问题标题】:c# HTTP 400 error (Bad Request) thrown by HttpWebRequest (intermitent)c# HttpWebRequest(间歇性)抛出的HTTP 400错误(Bad Request)
【发布时间】:2013-03-01 20:32:34
【问题描述】:

我的 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 服务,它有时也会间歇性地抛出相同的错误。 另一个额外的信息:我通过公司代理访问互联网 有人知道有什么问题吗? 这几天我一直在尝试解决这个问题,但没有运气,所以欢迎任何想法:-)

谢谢!

【问题讨论】:

    标签: c# httpwebrequest request


    【解决方案1】:

    这里报告了一个类似的问题:.Net HttpWebRequest.GetResponse() raises exception when http status code 400 (bad request) is returned

    我还注意到您没有处理 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());
                }
    }
    

    【讨论】:

    • 响应对象的实际内容是什么?使用 400 响应流应该仍然能够被解析。它可能包含可以提供帮助的信息。
    猜你喜欢
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2013-10-02
    相关资源
    最近更新 更多