Запрос System.Net.WebClient получает 403 Запрещено, но браузеры не имеют серверов Apache - PullRequest
5 голосов
/ 23 февраля 2010

Странно, я пытаюсь прочитать раздел на многих сайтах, и один конкретный тип сервера, Apache, иногда запрещает код 403. Не все серверы Apache делают это, поэтому это может быть параметр конфигурации или конкретная версия сервера.

Когда я проверяю URL с помощью веб-браузера (например, Firefox), страница загружается нормально. Код Сорта выглядит так:

var client = new WebClient();
var stream = client.OpenRead(new Uri("http://en.wikipedia.org/wiki/Barack_Obama"));

Обычно, 403 - это проблема с разрешением доступа, но обычно это небезопасные страницы. Я думаю, что Apache фильтрует что-то в заголовках запросов, так как я не пытаюсь их создавать.

Может быть, кто-то, кто знает больше об Apache, может дать мне несколько идей о том, чего не хватает в заголовках. Я бы хотел, чтобы заголовки были как можно меньше, чтобы минимизировать пропускную способность.

Спасибо

Ответы [ 4 ]

10 голосов
/ 23 февраля 2010

Попробуйте установить заголовок UserAgent:

string _UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
client.Headers.Add(HttpRequestHeader.UserAgent, _UserAgent);
4 голосов
/ 10 ноября 2010

У меня была похожая проблема, и настройки ниже решили ее

Client.Headers["Accept"] = "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
Client.Headers["User-Agent"] ="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDC)";
1 голос
/ 23 февраля 2010

Это может быть связано с заголовком UserAgent, как сказал thedugas, или фактически с тем, что браузер молча настроен на выполнение. Например, это может быть связано с тем, что не используется прокси-сервер, используемый браузером, или неправильные учетные данные для прокси-сервера. Это вещи, которые уже могут быть настроены в браузере, так что вы не знаете, что они должны быть сделаны.

0 голосов
/ 15 июня 2019

У меня была такая же проблема, и ответ не был очевидным. Я нашел решение, нюхающее сетевые коммуникации. Когда Apache предоставляет свою страницу «Testing 1 2 3 ...», он возвращает HTML с кодом запрета 403. Браузер игнорирует, получает код и показывает страницу, но de WebClient возвращает сообщение об ошибке. Решение состоит в том, чтобы прочитать ответ внутри инструкции «Уловка попытки». Вот мой код:

            Dim Retorno As String = ""
            Dim Client As New SiteWebClient
            Client.Headers.Add("User-Agent", "Mozilla/ 5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " &
                               "(KHTML, Like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
            Client.Headers.Add("Accept-Language", "pt-BR, pt;q=0.5")
            Client.Headers.Add("Accept", "Text/ html, application / xhtml + Xml, application / Xml;q=0.9,*/*;q=0.8")
            Try
                Retorno = Client.DownloadString("http://" & HostName & SitePath)
            Catch ex As Exception
                If ex.GetType = GetType(System.Net.WebException) Then
                    Try
                        Dim Exception As System.Net.WebException = ex
                        Dim Resposta As System.Net.HttpWebResponse = Exception.Response
                        Using WebStream As New StreamReader(Resposta.GetResponseStream(), System.Text.Encoding.GetEncoding("utf-8"))
                            Retorno = WebStream.ReadToEnd
                        End Using
                    Catch ex1 As Exception

                    End Try
                End If
            End Try

После попытки Try Retorno будет содержать HTML-ответ сервера, независимо от того, какой код ошибки возвращает сервер.

Заголовки не влияют на это поведение.

...