我有一個奇怪的問題發生。我有一些代碼必須做一個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()
什麼exceptionHandler.HandleError(除息);做? – jglouie 2012-07-09 17:31:32
您擁有的套接字錯誤不是HTTP事件 - 這是在HTTP通信發送之前。 exceptionHandler.HandleError(前);將在該路徑中被調用 – jglouie 2012-07-09 17:33:07
doh!有我的問題。 – Josh 2012-07-09 17:33:36