[英]How to terminate HttpWebRequest Connection in C#?It doesn't work even set timeout or readwritetimeout
我想在連接時間過長時終止httpwebrequest。 這是我寫的一個simaple代碼:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Timeout = 5000;
request.ReadWriteTimeout = 5000;
request.Proxy = new WebProxy("http://" + proxyUsed + "/", true);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.01; Windows NT 5.0)";
using (WebResponse myResponse = request.GetResponse())
{
using (Stream s = myResponse.GetResponseStream())
{
s.ReadTimeout = 5000;
s.WriteTimeout = 5000;
using (StreamReader sr = new StreamReader(s, System.Text.Encoding.UTF8))
{
result = sr.ReadToEnd();
httpLink = myResponse.ResponseUri.AbsoluteUri;
sr.Close();
}
s.Close();
}
myResponse.Close();
}
但是,有時連接需要大約15分鍾才能得到響應。 情況是在15分鍾之后我仍然可以獲得響應,但不是URL的完整源代碼。 我猜這個連接太慢了,以至於URL在超時時間內響應了一些數據,比如說在5秒內接收1byte,所以它不會使timoue到期但是它很長。 我該如何終止連接? 謝謝:)
您可能會發現超時實際上正在工作,但在嘗試關閉流時線程會掛起。 我不知道它為什么會發生,但有時卻會發生。 我從來沒有使用過ReadToEnd
,但是在使用Read
時我遇到了這個問題。
我在關閉流之前通過在請求上調用Abort
來解決問題。 這有點像kluge,但它很有效。 下面的縮寫代碼顯示了該技術。
HttpWebResponse response = null;
StreamReader sr = null;
try
{
response = (HttpWebResponse)request.GetResponse(...);
Stream s = response.GetResponseStream();
sr = new StreamReader(s, Encoding.UTF8);
// do your reading here
}
finally
{
request.Abort(); // !! Yes, abort the request
if (sr != null)
sr.Dispose();
if (response != null)
response.Close();
}
我發現ReadTimeout
和ReadWriteTimeout
按預期工作。 也就是說,當讀取超時時,執行確實會轉到finally
塊。 如果request.Abort
不存在,則對sr.Dispose
的調用將掛起。
分解流讀取,如果總時間太長則中止。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Timeout = 5000;
request.ReadWriteTimeout = 5000;
request.Proxy = new WebProxy("http://" + proxyUsed + "/", true);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.01; Windows NT 5.0)";//ahem! :)
DateTime giveUp = DateTime.UtcNow.AddSeconds(5);
using (WebResponse myResponse = request.GetResponse())
{
httpLink = myResponse.ResponseUri.AbsoluteUri;
using (Stream s = myResponse.GetResponseStream())
{
s.ReadTimeout = 5000;
s.WriteTimeout = 5000;
char[] buffer = new char[4096];
StringBuilder sb = new StringBuilder()
using (StreamReader sr = new StreamReader(s, System.Text.Encoding.UTF8))
{
for(int read = sr.Read(buffer, 0, 4096); read != 0; read = sr.Read(buffer, 0, 4096))
{
if(DateTime.UtcNow > giveUp)
throw new TimeoutException();
sb.Append(buffer, 0, read);
}
result = sb.ToString();
}
}
}
確保在異常時也關閉連接。 在這種情況下,WebResponse對象位於WebException上:
try
{
using (WebResponse myResponse = request.GetResponse())
// do stuff
}
catch (WebException webEx)
{
webEx.Response.Close();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.