WebClient или WebRequest для получения перенаправленного URL-адреса целевой страницы - PullRequest
0 голосов
/ 07 декабря 2018

Из строки, которую я проанализировал из Рисунка дня Бинга , я получил информацию о загружаемой картинке, скажем, сегодня это /az/hprichbg/rb/PearlHarborWindows_EN-US8565186567, тогда у нас будет полный URL-адрес изображенияпоходить на http://www.bing.com/az/hprichbg/rb/PearlHarborWindows_EN-US8565186567_1366x768.jpg

Обычно Bing имеет изображение с более высоким разрешением, поэтому я также скачаю изображение 1920x1200.Это легко с измененным URL-адресом, чтобы он был похож на http://www.bing.com/az/hprichbg/rb/PearlHarborWindows_EN-US8565186567_1920x1200.jpg, затем задайте задачу для WebClient, например client1.DownloadFile(url, fileName)

Проблема здесь в том, что в некоторые дни разрешение 1920x1200 недоступно, иURL загрузки этого разрешения (1920x1200) будет перенаправлен на URL изображения /sa/simg/hpb/NorthMale_EN-US8782628354_1920x1200.jpg - по умолчанию (вы можете проверить его).

Поэтому моя попытка былафункция, чтобы получить возвращенный / перенаправленный URL-адрес из входного URL-адреса:

 Public Function GetWebPageURL(ByVal url As String) As String
    Dim Request As WebRequest = WebRequest.Create(url)
    Request.Credentials = CredentialCache.DefaultCredentials
    Return Request.RequestUri.ToString 
 End Function

и сравнить с входным URL-адресом, чтобы увидеть, что они отличаются, но результат был не таким, как ожидалось.

Может ли кто-нибудь сообщить мне способ проверки этого перенаправленного URL-адреса, например, обратный URL-адрес после того, как мы нажмем Enter и дождемся загрузки сайта.

Пожалуйста, дайте мне идею, чтобы преодолеть это препятствие.Спасибо!

Примечания: Некоторые проблемы, связанные с правами доступа на разных ПК, не позволяют использовать HttpWebRequest, поэтому я предпочитаю решение, не использующее HttpWebRequest (WebClient или другие лучше).


С помощью @IvanValadares @ AlenGenzić и предложением Proxy для HttpWebRequest от @Jimi, я пришел к справедливому решению,как приведенный ниже код:

    url1 = "http://www.bing.com/az/hprichbg/rb/PearlHarborWindows_EN-US8565186567_1920x1200.jpg"

    Dim myHttpWebRequest As HttpWebRequest = CType(WebRequest.Create(url1), HttpWebRequest)
    myHttpWebRequest.MaximumAutomaticRedirections = 1
    myHttpWebRequest.AllowAutoRedirect = True
    Dim defaultProxy As IWebProxy = WebRequest.DefaultWebProxy
    If (defaultProxy IsNot Nothing) Then
        defaultProxy.Credentials = CredentialCache.DefaultCredentials
        myHttpWebRequest.Proxy = defaultProxy
    End If

    Dim myHttpWebResponse As HttpWebResponse = CType(myHttpWebRequest.GetResponse, HttpWebResponse)
    url2 = myHttpWebResponse.ResponseUri.ToString

    Label1.Text = url1
    Label2.Text = url2

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

С помощью @IvanValadares @ AlenGenzić и предложением Proxy для HttpWebRequest от @Jimi я пришел к справедливому решению, как показано ниже:

    url1 = "http://www.bing.com/az/hprichbg/rb/PearlHarborWindows_EN-US8565186567_1920x1200.jpg"

    Dim myHttpWebRequest As HttpWebRequest = CType(WebRequest.Create(url1), HttpWebRequest)
    myHttpWebRequest.MaximumAutomaticRedirections = 1
    myHttpWebRequest.AllowAutoRedirect = True
    Dim defaultProxy As IWebProxy = WebRequest.DefaultWebProxy
    If (defaultProxy IsNot Nothing) Then
        defaultProxy.Credentials = CredentialCache.DefaultCredentials
        myHttpWebRequest.Proxy = defaultProxy
    End If

    Dim myHttpWebResponse As HttpWebResponse = CType(myHttpWebRequest.GetResponse, HttpWebResponse)
    url2 = myHttpWebResponse.ResponseUri.ToString

    Label1.Text = url1
    Label2.Text = url2

System.Net.WebException: The remote server returned an error: (407) Proxy Authentication Required. нетбольше брошено.

0 голосов
/ 07 декабря 2018

Используйте AllowAutoRedirect и проверьте код состояния.

var webRequest = (HttpWebRequest)System.Net.WebRequest.Create("http://www.bing.com/az/hprichbg/rb/PearlHarborWindows_EN-US8565186567_1920x1200.jpg");
    webRequest.AllowAutoRedirect = false;
    using (var response = (HttpWebResponse)webRequest.GetResponse())
    {
       if (response.StatusCode == HttpStatusCode.Found)
       {
          // Have been redirect
       }
       else if (response.StatusCode == HttpStatusCode.OK)
       {
          // Have not been redirect
       }
    }

Использование HttpClient

 var handler = new HttpClientHandler()
 {
    AllowAutoRedirect = false
 };
 HttpClient client = new HttpClient(handler);
 HttpResponseMessage response = await client.GetAsync("http://www.bing.com/az/hprichbg/rb/PearlHarborWindows_EN-US8565186567_1920x1200.jpg");
 if (response.StatusCode == HttpStatusCode.Found)
 {
     // Have been redirect
 }
 else if (response.StatusCode == HttpStatusCode.OK)
 {
     // Have not been redirect
 }
...