C# System.Net.WebException: 底层连接被关闭:发送时发生了意外错误

17

我在运行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;

哪一行代码抛出了异常? - BJ Myers
@Jon,你的URL是https,看起来证书可能无效。你需要接受该证书。ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };尝试添加这个。 - loneshark99
@loneshark99 不行。那是一种可怕和肮脏的黑客技巧,绝不能放在任何生产代码中。Https协议已经完全由HttpWebRequest处理;没有必要手动干涉安全的TCP连接。 - Nyerguds
当然,我是在试图建议如果那就是导致它的原因。即服务器证书。 - loneshark99
7个回答

44

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

由于我访问的是HTTPS页面,我必须将Service Point Security Protocol设置为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自2015年起已被正式禁止使用,而TLS 1.0和TLS 1.1也很快可能会被禁止。来源:@aske-b


2
由于这是安全标准的选择,显然最好选择最新的(在撰写本文时为TLS 1.2),而不仅仅是运行正常。实际上,SSL3自2015年以来已被官方禁止使用,而TLS 1.0将很可能从2018年6月起被禁止使用 - Aske B.
@AskeB。我已经将您的评论添加到我的答案中。谢谢! - Bartho Bernsmann
2
如果你被困在 .net Framework 4.0 中,你可以使用 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; 作为等同于 TLS 1.2 的解决方案。 - Lutti Coelho
1
为什么没有人说这行代码应该放在哪里?! :( - Scott Fraley
2
在实际请求之前,确保你已经做好了准备。 - Bartho Bernsmann
Lutti Coelho 非常感谢!!!由于一个无法替换的音频库,我被困在 .NET 3.5 上。这使我能够从现在需要 TLS12 的网站获取 RSS。=== 太棒了 === - Bob Denny

11

1
这个问题通常是由于网站使用比所用的 .Net 框架启用和/或支持的 SSL/TLS 版本更高的版本引起的。 - Nyerguds

1
在我的情况下,当我在不同环境之间交换URL时,我忘记从“https”中删除“s”。 我意外地使用https访问Localhost。 如果您访问没有https证书或已过期的证书的http站点,则会发生类似的情况。

1
这个问题可能会在以下情况中出现:您想下载一个过滤链接,但没有权限下载该链接。请参考以下解决方法。

0
我在使用HttpWebRequest下载rss文件时遇到了错误。当我在浏览器中测试并检查响应代码时,发现url是正确的。尝试了这里的所有方法后,我意识到该网站可能会根据用户代理进行阻止。
更改请求中的用户代理字符串即可解决问题:
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中输入“我的用户代理是什么”


0

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

我检查了nexus服务器的配置,发现Nexus NuGet API-Key Realm没有激活。我激活了它并再次尝试,一切都正常工作了。

enter image description here

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


-8

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

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


3
请告知我们哪个选项(A,D,E,F,O)适合您。 - Dongming Yan
我在 HttpWebRequest request = (HttpWebRequest)WebRequest.Create 处收到错误。该请求仅有200个字符。 - Jon
5
答案中的链接已经失效,是否有更新的链接? - agDev
5
自古以来,微软一直是链接失效的冠军。 - undefined is our god
5
抱歉,链接无法使用。 - Raju Paladiya
https://www.betaarchive.com/wiki/index.php/Microsoft_KB_Archive/915599 - Ed M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接