HttpWebRequest выдает ошибку 404 в. NET Core 2.2, но работает в 3.0 - PullRequest
0 голосов
/ 27 марта 2020

Я обнаружил, что создание HTTP-запроса GET работает просто. NET Базовое консольное приложение, подобное этому:

    static void Main(string[] args) {
        string url = "https://www.zdnet.com/article/quantum-entanglement-breakthrough-could-boost-encryption-secure-communications/#ftag=RSSbaffb68";
        var req = (HttpWebRequest)WebRequest.Create(url);
        req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0";
        var resp = (HttpWebResponse)req.GetResponse();
        var respStream = new StreamReader(resp.GetResponseStream(), true);
        var html = respStream.ReadToEnd();
    }

Теперь я изменяю структуру в файле csproj с

<TargetFramework>netcoreapp3.0</TargetFramework>

до

<TargetFramework>netcoreapp2.2</TargetFramework>

и снова запустите тот же код. На этот раз выдает ошибку 404:

System. Net .WebException: «Удаленный сервер возвратил ошибку: (404) Not Found.»

Почему точно такой же код выдает 404 ошибки. NET Core 2.2? Это относительно простой запрос, и API HttpWebRequest не очень новый. Я также получил 404 ошибки при использовании более новой HttpClient. Кто-нибудь знает, что изменилось в. NET Core 3.0, который может объяснить это поведение?

1 Ответ

0 голосов
/ 28 марта 2020

Я проанализировал запросы, используя mitmproxy . Это позволяет расшифровывать tls traffi c, что нелегко осуществить с помощью традиционных сетевых инструментов, таких как Wireshark. Это очень просто: просто скачайте двоичные файлы mitmproxy, выполните двоичный файл mitmweb и добавьте прокси к экземпляру HttpWebRequest:

req.Proxy = new WebProxy("http://localhost:8080");
req.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

Для простоты я не добавил сертификат MITM в хранилище доверенных сертификатов , так как это только для локального тестирования. После захвата рабочего запроса с помощью. NET 3.0 и сбоя 2.2, я увидел, что 2.2 перенаправляет с https://www.zdnet.com/article/quantum-entanglement-breakthrough-could-boost-encryption-secure-communications/#ftag=RSSbaffb68 на https://www.zdnet.com/article/quantum-entanglement-breakthrough-could-boost-encryption-secure-communications/#ftag=rssbaffb68, где второй запрос возвращает 404.

3.0, кажется, удаляет эти хэштеги, потому что он запрашивает https://www.zdnet.com/article/quantum-entanglement-breakthrough-could-boost-encryption-secure-communications/, который работает. Поэтому я исправил это в своем приложении. NET 2.2 с помощью простого обходного пути:

var uri = new Uri(url);
url = $"{uri.Scheme}://{uri.Host}{uri.PathAndQuery}";
var document = GetDocumentNode(url);

Это удаляет параметр хештега из URL, в результате чего больше не возникает 404 ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...