2014-04-14 4 views
0

안녕하세요 여러분, 항상 url 소스를 반환하는 메소드를 만들려고합니다. 예를 들어 인터넷이 작동하지 않으면 URL 소스가 반환 될 때까지 계속 작동하고 다른 경우는 계속됩니다. 발생합니다. 지금까지 내 방법으로 인터넷을 "끄고"다시 켜는 절차는 normaly를 계속합니다 하지만 시간 초과가 발생하고 인스턴트 메시지가 "falling"루프에있을 때 문제가 발생했습니다 while (true) 올바른 접근 방식이 아니라 내 테스트를 위해 사용하고 있습니다.Webrequest cant "escape"timeout

그래서 어떻게 시간 초과 예외를 건너 뛰고 내 방법을 "다시 시도"할 수 있습니까? 참고

public static async Task<string> GetUrlSource(string url) 
{ 
    string source = ""; 
    while (true) 
    { 
     HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(url); 
     hwr.AllowAutoRedirect = true; 
     hwr.UserAgent = UserAgent; 
     hwr.Headers.Add(hd_ac_lang[0], hd_ac_lang[1]); 
     hwr.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     hwr.Timeout = 14000; 
     try 
     { 
      using (var response = hwr.GetResponse()) 
      { 
       using (var reader = new StreamReader(response.GetResponseStream())) 
       { 
        source = await reader.ReadToEndAsync(); 
        if (check_source(source)) 
        { 
         return source; 
        } 
       } 
      } 
     } 
     catch (WebException ex) 
     { 
      hwr.Abort(); 
      if (ex.Status == WebExceptionStatus.ProtocolError) 
      { 
       if (((HttpWebResponse)ex.Response).StatusCode == HttatusCode.NotFound) 
       { 
        // handle the 404 here 
        return "404"; 
       } 
       } 
       else 
       { 
       Console.WriteLine(ex.Status.ToString());  
       } 
     } 
    } 
} 

:가 나는 hwr.Abort()를 가지고 사용; finnaly 절로하지만 그것은 도움이되지 않았다.

편집 : 콘솔이 내 메시지가 14 초마다이 메시지를 기록하는 것과 관련이 있다고 생각합니다.

+0

현재 사용중인 방법에 문제가 있습니까? 제한 시간이 초과되어 루프백됩니다. – CathalMF

+0

@CathalMF 둘 중 하나만 알지만, 첫 번째 시간 초과 후 루프에 빠지는 것 같습니다. 시간 초과 상태에서 그 영원히 그 후 hwr처럼. – Incognito

+0

서버 종료가 시간 초과 루프를 일으키는 것은 아닌지 확실합니까? – CathalMF

답변

1

대안 솔루션이 될 수 있습니다 시간 제한 문제를 제거하는 것은 소스 코드를 얻으려면 다음 WebBrowser 구성 요소를 사용하고 필요한 URL (webbrowser1.Navigate(url);)로 이동하고, documentcompleted 이벤트가 발생할 때까지 루프에서 대기하고있다 이 줄을 기준으로 :

string source = webbrowser1.DocumentText; 
+0

글쎄,이 일을 할 수있는 추측하지만 내 방법을 수정하고 내 문제의 원인을 찾으십시오. – Incognito

0

글쎄 그 요청의 서비스 지점과 관련된 솔루션을 찾은 것 같습니다.

내 캐치에서 시간 초과가 발생하면 연결을 해제하는 데 사용합니다.

hwr.ServicePoint.CloseConnectionGroup(hwr.ConnectionGroupName); 

이 정보는 계속 업데이트됩니다.