HttpWebRequest httpWebRequest = WebRequest.CreateHttp("http://www.kangry.net"); httpWebRequest.ReadWriteTimeout = 300000; httpWebRequest.Timeout = 100000;
MSDN對ReadWriteTimeout的說明以下:web
在寫入由 GetRequestStream 方法返回的流時,或在讀取由 GetResponseStream 方法返回的流時,會用到 ReadWriteTimeout 屬性。HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.kangry.net/Home/t1"); req.Timeout = 5000; //設置超時時間爲5秒 Stopwatch timer = new Stopwatch(); timer.Start(); string data; HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); using (StreamReader reader = new StreamReader(resp.GetResponseStream(), System.Text.Encoding.UTF8)) { data = reader.ReadToEnd(); } timer.Stop(); Console.Write(data + "\r\n" + timer.Elapsed.TotalSeconds.ToString() + "\r\n");
其中我作了幾個頁面,分別是」t1″、「t2」、「t3」、「t4」。api
其中t1頁面直接返回文本內容,用做基礎對照。
t2頁面設置了一個延時,可是延時時間在超時的範圍內。
t3頁面設置了一個延時,可是延時時間超過抓取程序的timeout時間。
t4頁面首先是先往客戶端發送一部份內容,而後延時一段比timeout更長的時間,模擬出網速很慢的樣子,再把剩下的字符串發送完畢。
代碼以下:服務器
public ActionResult t1() { return Content("直接返回內容。"); } public ActionResult t2() { System.Threading.Thread.Sleep(3000); return Content("休息了3秒"); } public ActionResult t3() { System.Threading.Thread.Sleep(7000); return Content("休息了7秒"); } public ActionResult t4() { using (var streamWriter = new StreamWriter(Response.Body, System.Text.Encoding.UTF8)) { streamWriter.Write("hello"); //調用StreamWriter的Flush方法後,Http響應頭和上面的字符串"hello"就會發送給客戶端了 streamWriter.Flush(); System.Threading.Thread.Sleep(8000); streamWriter.Write("Kangry"); } //若是不使用StreamWriter,也能夠用Response.Body.Write方法來寫入數據到Http響應 //using (Response.Body) //{ // byte[] data = System.Text.Encoding.UTF8.GetBytes("hello"); // Response.Body.Write(data, 0, data.Length); // //調用Response.Body.Flush方法後,Http響應頭和字符串"hello"就會發送給客戶端了 // Response.Body.Flush(); // System.Threading.Thread.Sleep(8000); // data = System.Text.Encoding.UTF8.GetBytes("Kangry"); // Response.Body.Write(data, 0, data.Length); // Response.Body.Flush(); //} return new EmptyResult(); }
測試的結果是:異步
原文連接學習