C # Web исключение неожиданное EOF - PullRequest
1 голос
/ 27 апреля 2019

Я пытаюсь загрузить веб-страницу json с imdb, чтобы найти актера.

        try
        {
            using (WebClient wc = new WebClient())
            {
                string content = wc.DownloadString("https://v2.sg.media-imdb.com/suggests/names/b/brad.json");
            }
        }
        catch (WebException x)
        {
            x.ToString();
        }

Всякий раз, когда я пытаюсь сделать загрузку.

Исключение составляет:

The underlying connection was closed: An unexpected error occurred on a send.

И исключение внутренней сети:

Received an unexpected EOF or 0 bytes from the transport stream.

Из того, что я прочитал. Это происходит из-за неправильной настройки одного из серверов imdb.

Чтобы попытаться решить эту проблему, я использовал

System.Net.ServicePointManager.SecurityProtocol = (System.Net.SecurityProtocolType)(3072);

Чтобы установить протокол безопасности Tls12, который решает проблему на моем ПК.

Однако, когда я пытаюсь использовать его на моем втором ПК. Эта строка выдает исключение:

System.NotSupported: The requested security protocol is not supported

То, что я предполагаю, означает, что на этом ПК нет поддержки tls12.

У меня установлена ​​платформа .NET Framework 4.5.1 на этом ПК, и я не могу установить .NET Framework 4.7, так как при установке произошел сбой.

Я предполагаю, что протокол безопасности поставляется с 4.7, но я не вижу подтвержденного в MSDN.

Как я могу получить веб-страницу для загрузки на этом втором ПК?

Можно ли вручную установить протокол Tls12?

Есть ли альтернатива, использующая HttpWebRequest или какой-нибудь отдельный исполняемый файл вместо этого?

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

В итоге я использовал двоичный файл cURL, поскольку он не зависит от .NET Framework.

0 голосов
/ 30 апреля 2019

Я настоятельно рекомендую обновить до последней версии .Net Framework "4.7.X".

Согласно Документация Microsoft :

Начиная с .NET Framework 4.7, значение по умолчанию этого свойство SecurityProtocolType.SystemDefault. Это позволяет .NET Сетевые API-интерфейсы платформы на основе SslStream (такие как FTP, HTTP и SMTP) для наследования протоколов безопасности по умолчанию от действующих система или из любых пользовательских конфигураций, выполняемых системой администратор.

Таким образом, теоретически, обновление до последней версии .Net Framework должно решить проблему без изменения каких-либо значений системного реестра, например, поддержки более низкой версии TLS или переопределения поведения платформы по умолчанию.

Кроме того, причина того, что он работал только на вашей машине, заключается в том, что ваша машина поддерживает TLS 1.2, а другая - нет.

Чтобы убедиться, что вы можете проверить реестр, в котором включена версия:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

Если вам нужно включить TLS 1.2 (который должен быть включен по умолчанию, если он регулярно обновляется), вы можете проверить следующие статьи:

https://support.microsoft.com/en-us/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi

https://www.itnota.com/enabling-tls-1-2-default-security-protocol-windows-servers/

Подводя итог:

  • Попробуйте обновить до последней версии .Net Framework.
  • если это было невозможно тогда используйте

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

  • если он не работал на другом компьютере, то проверьте поддерживаемый TLS версии на этой машине

.

...