2011-10-19 6 views
6

接続に時間がかかりすぎると、httpwebrequestを終了します。ここで は私が書いたばかりsimapleコードです:C#でHttpWebRequest Connectionを終了する方法?タイムアウトまたはリードライトタイムアウトを設定しても動作しません。

  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の完全なソースコードは取得できません。 私は接続が遅すぎると思うので、タイムアウト内の少しのデータが返ってきます。ちょうど例えば5秒で1バイトを受け取ると言うので、timoueは期限切れになりませんが、非常に長くなります。 どうすれば接続を終了できますか? ありがとう:)

答えて

2

ストリームの読み取りを中断し、合計時間が長すぎる場合は中止します。

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(); 
     } 
    } 
} 
4

タイムアウトは実際には機能していますが、ストリームを閉じるときにスレッドがハングすることがあります。私はなぜそれが起こるのか分からないが、ときどきそれが起こる。私はReadToEndを使ったことが一度もありませんでしたが、Readを使用したときにこれを実行しました。

ストリームを閉じる前に、リクエストでAbortを呼び出して問題を解決しました。それは少しのくぼみですが、効果的です。以下の略語はこの技法を示しています。

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(); 
} 

私は何を見つけたことは予想通りReadTimeoutReadWriteTimeout作品ということです。つまり、読み込みタイムアウトが発生すると、実行は実際にブロックfinallyに移動します。 request.Abortが存在しない場合は、sr.Disposeへの呼び出しがハングします。

関連する問題