【问题标题】:C# System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a sendC# System.Net.WebException:底层连接已关闭:发送时发生意外错误
【发布时间】:2015-07-05 08:15:45
【问题描述】:

我只在一台运行 Windows Server 2003 的服务器上收到此错误:

System.Net.WebException:底层连接已关闭:发送时发生意外错误。


这是我的代码...有什么想法吗?

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https:// URL HERE ");
//request.Headers.Add("Accept", "application/xml");
byte[] bytes;
bytes = System.Text.Encoding.ASCII.GetBytes(xml);
request.KeepAlive = false;
request.Accept = "application/xml";
request.ContentType = "application/xml; charset='UTF-8'";
request.ContentLength = bytes.Length;
request.Method = "POST";
request.Timeout = 10000;
request.ServicePoint.Expect100Continue = false;

【问题讨论】:

  • 哪一行抛出异常?
  • @Jon 你的 URL 是 https,看起来证书可能无效。您需要接受 cert 。 ServicePointManager.ServerCertificateValidationCallback = 委托 { 返回真; };尝试添加这个。
  • @loneshark99 不。这是一个可怕而肮脏的黑客,不应该放在任何生产代码中。无论如何,https 协议完全由 HttpWebRequest 处理;无需手动弄乱安全的 tcp 连接的东西。
  • 当然,我试图建议这是否是导致它的原因。即来自服务器的证书

标签: c# windows-server-2003 system.net.webexception


【解决方案1】:

将 HttpWebRequest.KeepAlive 设置为 false 对我不起作用。

由于我访问的是 HTTPS 页面,我不得不将服务点安全协议设置为 Tls12。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

注意还有其他 SecurityProtocolTypes:

SecurityProtocolType.Ssl3 
SecurityProtocolType.Tls
SecurityProtocolType.Tls11

因此,如果 Tls12 不适合您,请尝试其余三个选项。

另请注意,您可以设置多个协议。这在大多数情况下更可取。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12| SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

编辑:由于这是安全标准的选择,显然最好使用最新的(撰写本文时为 TLS 1.2),而不仅仅是做有效的事情。其实SSL3一直是officially prohibited from use since 2015TLS 1.0 and TLS 1.1 will likely be prohibited soon as well。来源:@aske-b

【讨论】:

  • 由于这是安全标准的选择,显然最好使用最新的(撰写本文时为 TLS 1.2),而不仅仅是做有效的事情。事实上,SSL3 一直是officially prohibited from use since 2015,而 TLS 1.0 将是likely be prohibited from June 2018
  • @AskeB。我已将您的评论添加到我的答案中。谢谢!
  • 如果你被困在 .net Framework 4.0 中,你可以使用 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; 等同于 TLS 1.2
  • 怎么没人说WHERE这行代码应该去哪里?! :(
  • @ScottFraley 在您提出实际请求之前。
【解决方案2】:

我在 .NET 4.5 中使用 RestSharp 时遇到了同样的错误。我用 cURL 测试了相同的 URL,它运行良好。经过长时间调试,发现设置SecurityProtocol解决了这个问题。

见:"The underlying connection was closed: An unexpected error occurred on a send." With SSL Certificate

【讨论】:

  • 这个。这主要是由于网站使用的 SSL/TLS 版本高于所使用的 .Net 框架启用和/或支持的版本。
【解决方案3】:

就我而言,当我在环境之间交换 URL 时,我忘记从“https”中删除“s”。我意外地用 https 访问了 Localhost。如果您访问没有 https 证书或证书过期的 http 站点,也会发生同样的情况。

【讨论】:

    【解决方案4】:

    在这种情况下可能会出现此问题,您需要下载一个过滤链接,而您没有下载该链接的权限。

    【讨论】:

      【解决方案5】:

      我在使用 API-KEY 从命令行手动将 nuget 包部署到 nexus 服务器时遇到了这个错误。

      我检查了 nexus 服务器配置,发现 Nexus NuGet API-Key Realm 未激活。我已经激活它并再次尝试,一切正常。

      因此,您应该检查服务器端以确认您已激活相关领域。

      【讨论】:

        【解决方案6】:

        我在尝试使用 HttpWebRequest 下载 rss 文件时遇到此错误。当我在浏览器中测试并检查响应代码时,网址很好。 在这里尝试了所有方法后,我突然想到该站点可能基于用户代理被阻止。

        更改请求中的用户代理字符串有效:

        let request = WebRequest.Create(url) :?> HttpWebRequest
        request.UserAgent <- @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
        let response = request.GetResponse()
        

        此用户代理字符串来自在 Google Chrome 中输入“我的用户代理是什么”

        【讨论】:

          【解决方案7】:

          当客户端计算机无法发送 HTTP 请求时会出现此问题。客户端计算机无法发送 HTTP 请求,因为连接已关闭或不可用。当客户端计算机发送大量数据时,可能会出现此问题。要解决此问题,请参阅解决方案 A、D、E、F 和 O。

          https://support.microsoft.com/en-us/kb/915599

          【讨论】:

          • 让我们知道哪个选项(A、D、E、F、O)适合您
          • 我在 HttpWebRequest request = (HttpWebRequest)WebRequest.Create 得到错误。请求只有 200 个字符。
          • 答案中的链接失效了,有更新的链接吗?
          • 微软一直是链接失效的冠军
          • 链接不可用:(
          猜你喜欢
          • 1970-01-01
          • 2020-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多