1

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 サービスを呼び出しますが、これも断続的に同じエラーをスローすることがあります。別の追加情報: 会社のプロキシ経由でインターネットにアクセスしています。私は数日間これを解決しようとして運が悪かったので、どんなアイデアでも大歓迎です:-)

ありがとう!

4

1 に答える 1

0

同様の問題がここで報告されています: .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());
            }
}
于 2013-03-01T20:47:16.167 に答える