2013-03-01 246 views
0

我有一個Web服務的問題。從Web方法我調用這個其他方法來發出HTTP請求。我需要做的是從URL獲取XML響應並對其進行處理。這是我做的HTTP請求的代碼:c#HttpWebRequest引發HTTP 400錯誤(錯誤請求)(intermitent)

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; 
     } 
    } 

這個工作對我的農業開發環境(我的電腦)的罰款,但是當我移動到生產服務器環境(Windows 2008在IIS)我得到一個HTTP 400我做WebRequest時出錯。 爲了更難以調試這種間歇性的事情。這意味着它可以運行一段時間,但一段時間後它會停止工作並拋出HTTP 400錯誤。 另一個額外信息:從另一個Web服務的Web方法中,我調用另一個Web服務,這些Web服務偶爾也會引發相同的錯誤。 另一個額外的信息:我通過公司代理訪問互聯網 有誰知道什麼是錯的? 我一直在努力工作幾天沒有運氣,所以任何想法都歡迎:-)

謝謝!

回答

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()); 
      } 
} 
+0

不,我剛剛嘗試過。它不起作用。 – Seba 2013-03-01 21:37:11

+0

響應對象的實際內容是什麼?對於400,響應流應該仍然可以被解析。它可能包含可能有所幫助的信息。 – 2013-03-06 21:18:18