簡體   English   中英

httpclient在重定向時引發異常

[英]httpclient throw exception on redirect

我正在嘗試使用HttpClient下載網頁,這是我的代碼:

private async Task<string> _doRequest(string url)
{
  string result = string.Empty;

  var client = HttpClient;
  using(var request = new HttpRequestMessage()
  {
    RequestUri = new Uri(url),
    Method = HttpMethod.Get
  }){
    using (HttpResponseMessage response = client.SendAsync(request).Result)
      if (response.Headers.Location == null)
      {
        using (HttpContent content = response.Content)
        {
          result = await content.ReadAsStringAsync();
        }
      }
      else
      {
        result = await _doRequest(response.Headers.Location.ToString());
      }
  };

  return result;
}

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");

當我嘗試使用url = "https://www.gls-italy.com/?option=com_gls&view=track_e_trace&mode=search&numero_spedizione=TE170187747&tipo_codice=nazionale"執行代碼時

我得到以下內容: 在此處輸入圖片說明

這是導致我嘗試使用curl的原因: 在此處輸入圖片說明

在這里我迷路了。 對我來說,它看起來像是帶有位置的有效302,但是由於某些原因,HttpClient認為不是,而是拋出異常。

最初需要明確的是,我依靠AllowAutoRedirect默認值並強制HttpClient進行重定向,但沒有成功,我遇到了相同的異常,導致我自己嘗試對其進行管理。 但是沒有成功。

有人知道發生了什么嗎? 如何使其運作?

提前致謝。

類級別的對象:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM