2017-12-17 31 views
1
나는 HttpClient를 가진 웹 페이지를 다운로드하려고

에 던져 예외입니다 HttpClient를, 그건 내 코드 리디렉션

var handler = new HttpClientHandler(); 
    handler.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 
    handler.AllowAutoRedirect = false; 
    HttpClient = new HttpClient(handler); 
    HttpClient.DefaultRequestHeaders.Add("User-Agent", @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"); 

내가 실행하려고 enter image description here

: "https://www.gls-italy.com/?option=com_gls&view=track_e_trace&mode=search&numero_spedizione=TE170187747&tipo_codice=nazionale"

URL을 사용하여 코드 = 나는 다음과 같은 수

컬과 시도 나를 이끌 것입니다 어느 : enter image description here

을 그리고 여기에 내가 잃어버린하고있다. 나에게 그것은 위치가 유효한 302처럼 보이지만 몇 가지 이유 때문에 HttpClient는 다르게 생각하고 예외를 throw합니다.

처음에는 AllowAutoRedirect 기본값에 의존하여 리디렉션을 수행하도록 HttpClient를 밀어 넣었습니다. 작동하지 않았고,이 동일한 예외가 발생하여 직접 관리하려고했습니다. 그러나 성공하지 못했습니다.

누구든지 무슨 일이 일어 났는지 알고 있습니다. 어떻게 작동 시키는가?

미리 감사드립니다. 클래스 수준에서

+1

그것은 아니에요 HttpClient를. HttpWebRequest와의 링크를 시도했지만 WebException.SendFailure가 발생합니다. 이것은 잘못된 302 응답입니다. 연결이 닫힙니다. 위치는 새 주소가'https : // wwwdr.' (...)임을 나타냅니다. 'www'를'wwwdr'으로 바꾸면 서버가 제대로 응답합니다. – Jimi

+1

질문에 대답하지 않지만 비동기 메서드에서'.Result'를 사용하지 않으려는 헤드 업입니다. 교착 상태가 발생할 수 있습니다. client.SendAsync (request)를 기다리고 있다면 결과를 풀고 교착 상태 시나리오를 피할 수 있으며 스레드에서 더 많은 사용을 얻을 수 있습니다. –

+0

@ 지미 내가 wwwdr을 요청하면 그것들을 바꿀 수 있다는 것을 알고있다. 나는 리디렉션을 따르는 방법이 필요하다. 컬링은 리디렉션을 따르므로 C#에서 관리해야한다. –

답변

0

객체 :

HttpClientHandler Http_Handler = new HttpClientHandler(); 
HttpClient Http_Client = new HttpClient(); 
CookieContainer HttpClCookieJar = new CookieContainer(); 

HttpClient를 설치 스텁 :

private void HttpClient_Setup() 
{ 
    Http_Handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
    Http_Handler.AllowAutoRedirect = false; 
    Http_Handler.CookieContainer = HttpClCookieJar; 
    Http_Handler.UseCookies = true; 
    Http_Handler.UseDefaultCredentials = true; 
    Http_Client.Timeout = new TimeSpan(30000); 
    Http_Client = new HttpClient(Http_Handler); 
    Http_Client.DefaultRequestHeaders.Add("User-Agent", @"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"); 
    Http_Client.DefaultRequestHeaders.Add("Accept-Language", "it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3"); 
    Http_Client.DefaultRequestHeaders.Add("Accept", "*/*"); 
    Http_Client.DefaultRequestHeaders.Add("Cache-Control", "no-cache"); 
} 

비동기 HttpClient를 요청 :

public async Task<string> HttpClient_Request(string RequestURL) 
{ 
    string _responseHtml = string.Empty; 
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | 
              SecurityProtocolType.Tls11 | 
              SecurityProtocolType.Tls12; 
    try 
    { 
     using (HttpRequestMessage _requestMsg = new HttpRequestMessage()) 
     { 
     _requestMsg.Method = HttpMethod.Get; 
     _requestMsg.RequestUri = new Uri(RequestURL); 

     using (HttpResponseMessage _response = await Http_Client.SendAsync(_requestMsg)) 
     { 
      using (HttpContent _content = _response.Content) 
      { 
       _responseHtml = await _content.ReadAsStringAsync(); 
      }; 
     }; 
     }; 
    } 
    catch (HttpRequestException eW) 
    { 
     Console.WriteLine("Message: {} Source: {1}", eW.Message, eW.Source); 
    } 
    catch (Exception eX) 
    { 
     Console.WriteLine("Message: {} Source: {1}", eX.Message, eX.Source); 
    } 
    return _responseHtml; 
}