C#Web异常意外EOF

时间:2019-04-27 11:54:09

标签: c# security ssl web webclient

我正在尝试从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上确认这一点。

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

我可以手动安装Tls12协议吗?

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

2 个答案:

答案 0 :(得分:0)

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

根据Microsoft Documentation

  

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

因此,从理论上讲,更新到最新的.Net Framework应该可以解决该问题,而无需更改任何系统注册表值,例如,支持较低的TLS版本或覆盖Framework的默认行为。

也可能它只能在您的计算机上运行的原因可能是,您的计算机支持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 此计算机上的版本

答案 1 :(得分:0)

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