【问题标题】:C# Web exception unexpected EOFC# Web 异常意外 EOF
【发布时间】:2019-09-16 17:11:42
【问题描述】:

我正在尝试从 imdb 下载 json 网页以查找演员。

        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,这确实解决了我的 PC 上的问题。

但是,当我尝试在第二台 PC 上使用它时。该行抛出异常:

System.NotSupported: The requested security protocol is not supported

我认为这意味着它在该 PC 上不支持 tls12。

我在那台 PC 上安装了 .NET Framework 4.5.1,但由于安装失败,我无法安装 .NET Framework 4.7。

我认为安全协议是 4.7 附带的,但我没有在 MSDN 上看到这一点。

如何在第二台电脑上下载网页?

我有办法手动安装 Tls12 协议吗?

是否有替代方法使用 HttpWebRequest 或一些独立的可执行文件?

【问题讨论】:

  • 对 4.5.1 的支持很久以前就结束了。你为什么还在用它? 4.7就算做不到,4.5.2和4.6还是可以试试的。
  • @mason,最佳解决方案是与 .NET Framework 3.5 一起使用,甚至独立于 .NET Framework。如果我有问题,那么其他人也会有问题,所以我宁愿没有如此高和错误的依赖关系。
  • “如此高且错误的依赖项”是指“像任何理智的人一样在受支持的版本上运行”吗?哪个版本的 Windows 失败了?

标签: c# security ssl web webclient


【解决方案1】:

我最终使用了 cURL 二进制文件,因为它不依赖于 .NET Framework。

【讨论】:

    【解决方案2】:

    我强烈建议更新到最新的 .Net Framework“4.7.X”。

    根据Microsoft Documentation

    从 .NET Framework 4.7 开始,这个的默认值 属性是 SecurityProtocolType.SystemDefault。这允许 .NET 基于 SslStream 的框架网络 API(如 FTP、HTTP 和 SMTP)从操作中继承默认的安全协议 系统或系统执行的任何自定义配置 管理员。

    所以从理论上讲,更新到最新的 .Net 框架应该可以在不更改任何系统注册表值的情况下解决问题,例如,支持较低的 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 本机上的版本

    .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多