在工作中用C#開發了一個小程序,不斷訪問去請求一個網站的頁面,在循環過程中有時會報“遠程服務器返回錯誤: (500) 內部服務器錯誤”,有時不會,出現的時機也不太一樣。開始以為是網站的問題,后來網站是可以正常訪問的,那就是自己程序的問題了。
for (int i = refreshAccount.startNum; i <= refreshAccount.endNum; i++) { String data2 = urlstr; loadBranch2Request = (HttpWebRequest)HttpWebRequest.Create(data2); loadBranch2Request.CookieContainer = request2.CookieContainer; loadBranch2Response = (HttpWebResponse)loadBranch2Request.GetResponse(); reader = new StreamReader(loadBranch2Response.GetResponseStream(), Encoding.UTF8); string result3 = reader.ReadToEnd(); loadBranch2Response.Close(); reader.Close(); ………… }
從兩個方向找原因,一是HttpWebRequest的正確寫法,二是出現上述問題的原因。在查閱了同類問題的解決方法后,大致判斷為請求報文的問題。
兩個參考博文如下:
C#模擬http 發送post或get請求:https://www.cnblogs.com/aaronguo/p/7063790.html
HttpWebResponse遠程服務器返回錯誤: (500) 內部服務器錯誤 的解決辦法:https://blog.csdn.net/henrycg55/article/details/5330323
想當然以為用的是get方法, 不用設置loadBranch2Request.ContentType的值,事實上設置Method和ContentType的值卻解決了上面的問題。
loadBranch2Request.Method = "GET";
loadBranch2Request.ContentType = "text/html;charset=UTF-8";
for (int i = refreshAccount.startNum; i <= refreshAccount.endNum; i++) { String data2 = urlstr; loadBranch2Request = (HttpWebRequest)HttpWebRequest.Create(data2); loadBranch2Request.CookieContainer = request2.CookieContainer; loadBranch2Request.Method = "GET"; loadBranch2Request.ContentType = "text/html;charset=UTF-8"; loadBranch2Response = (HttpWebResponse)loadBranch2Request.GetResponse(); reader = new StreamReader(loadBranch2Response.GetResponseStream(), Encoding.UTF8); string result3 = reader.ReadToEnd(); loadBranch2Response.Close(); reader.Close(); ………… }
如果想獲取錯誤頁面的源碼,可以用如下方法
參考:https://www.cnblogs.com/cresuccess/archive/2009/12/09/1619977.html
用下面的代碼就不論錯誤發生與否,都可以獲得服務器段頁面的源代碼。
HttpWebResponse res;
try
{
res = (HttpWebResponse)req.GetResponse();
}
catch (WebException ex)
{
res = (HttpWebResponse)ex.Response;
}
StreamReader sr = new StreamReader(res.GetResponseStream(), strEncode);
strHtml = sr.ReadToEnd();
當異常發生事后,WebException 中不僅有 StatusCode 標志着 HTTP 的錯誤代碼,而且它的 Response 屬性還包含由服務器發送的 WebResponse,來指示遇到的實際 HTTP 錯誤。