0

我有一個奇怪的問題發生。我有一些代碼必須做一個http post到客戶端的服務器。他們的帖子將內容返回給我,我需要向我的用戶展示這些內容。如果你是一個問題,我想捕捉錯誤並注入我自己的內容,讓用戶知道有問題。System.Net.WebException沒有被捕獲

這是我執行http post的靜態助手類。

public static class HttpPostHelper 
{ 
    public static string Post(string url, NameValueCollection values) 
    { 
     StringBuilder dataBuilder = new StringBuilder(); 

     foreach (var key in values.AllKeys) 
     { 
      EncodeAndAddItem(ref dataBuilder, key, values[key]); 
     } 

     Uri uri = new Uri(url); 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = dataBuilder.Length; 
     using (Stream writeStream = request.GetRequestStream()) 
     { 
      UTF8Encoding encoding = new UTF8Encoding(); 
      byte[] bytes = encoding.GetBytes(dataBuilder.ToString()); 
      writeStream.Write(bytes, 0, bytes.Length); 
     } 

     string result = String.Empty; 

     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     { 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8)) 
       { 
        result = readStream.ReadToEnd(); 
       } 
      } 
     } 

     return result; 
    } 

    private static void EncodeAndAddItem(ref StringBuilder baseRequest, string key, string dataItem) 
    { 
     if (baseRequest == null) 
     { 
      baseRequest = new StringBuilder(); 
     } 
     if (baseRequest.Length != 0) 
     { 
      baseRequest.Append("&"); 
     } 

     baseRequest.Append(key); 
     baseRequest.Append("="); 
     baseRequest.Append(System.Web.HttpUtility.UrlEncode(dataItem)); 
    } 
} 

這裏是我的代碼,發佈帖子並返回內容。

private string GetReturnContent(string callback, NameValueCollection data, LogRequest request) 
{ 
    string content = String.Empty; 

    try 
    { 

     content = HttpPostHelper.Post(callback, data); 

     request.Message = String.Format("Content Retrieved from Callback: {0}", content); 

     logService.Debug(request); 
    } 
    catch (System.Net.WebException ex) 
    { 
     var response = ex.Response as HttpWebResponse; 

     if (response != null) 
     { 
      if ((int)response.StatusCode == 403) 
      { 
       content = String.Format("The url {0} returned access denied (403).", callback); 
       request.Message = content; 
       logService.Warn(request); 
      } 
      else if ((int)response.StatusCode == 404) 
      { 
       content = String.Format("The url {0} returned page not found (404).", callback); 
       request.Message = content; 
       logService.Warn(request); 
      } 
      else if ((int)response.StatusCode == 405) 
      { 
       content = String.Format("The url {0} returned 405 error. Please ensure the url is configured to accept http POST requests", callback); 
       request.Message = content; 
       logService.Warn(request); 
      } 
      else if ((int)response.StatusCode == 500) 
      { 
       content = String.Format("The url {0} returned a server error (500).", callback); 
       request.Message = content; 
       logService.Warn(request); 
      } 
      else 
      { 
       exceptionHandler.HandleError(ex); 

       content = String.Format("The url {0} returned an error: {1}", callback, ex.Message); 
       request.Message = content; 
       logService.Error(request); 
      } 
     } 
     else 
     { 
      exceptionHandler.HandleError(ex); 

      content = String.Format("The url {0} returned an error: {1}", callback, ex.Message); 
      request.Message = content; 
      logService.Error(request); 
     } 
    } 

    return content; 
} 

的問題是,不管是什麼,我總是得到一個服務器錯誤報告給我(通過電子郵件報告的處理程序,但這是另一回事。我已經異常抓住,我沒有再-throwing它,但我仍然得到一個錯誤報告

例外:

System.Net.WebException:無法連接到遠程服務器

內部異常消息:

System.Net.Sockets.SocketException:A連接嘗試失敗,因爲連接的方沒有正確一段時間後響應或已建立的連接失敗,因爲連接的主機未能響應[節錄]

堆棧跟蹤指向該行的罪魁禍首我PostHelper

using (Stream writeStream = request.GetRequestStream()) 

在System.Net.HttpWebReq uest.GetRequestStream(TransportContext &上下文)在System.Net.HttpWebRequest.GetRequestStream()

+1

什麼exceptionHandler.HandleError(除息);做? – jglouie 2012-07-09 17:31:32

+1

您擁有的套接字錯誤不是HTTP事件 - 這是在HTTP通信發送之前。 exceptionHandler.HandleError(前);將在該路徑中被調用 – jglouie 2012-07-09 17:33:07

+0

doh!有我的問題。 – Josh 2012-07-09 17:33:36

回答

2

你得到一個套接字錯誤。這個錯誤發生在HTTP流量發送之前(因此沒有狀態碼)。

此塊是會得到執行(因此你的錯誤電子郵件通知):

exceptionHandler.HandleError(ex); 

content = String.Format("The url {0} returned an error: {1}", callback, ex.Message); 
request.Message = content; 
logService.Error(request);